3

我正在尝试测试 gcc 的 -fsanitize=thread 的使用情况,它抱怨意外的内存映射,也许内核中可能发生了一些变化,这就是它的原因。我能做些什么来让它发挥作用吗?

这就是我正在做的...

mfrw@kp ...fpp/asgn/as2 % 
mfrw@kp ...fpp/asgn/as2 % cat tiny.cpp 
#include <pthread.h>
int global;
void *thread(void *x) {
        global = 42;
        return x;
}
int main() {
        pthread_t t;
        pthread_create(&t, NULL, thread, NULL);
        global = 43;
        pthread_join(t, NULL);
        return global;
}
mfrw@kp ...fpp/asgn/as2 % g++ tiny.cpp -fsanitize=thread -pie -fPIC -g -O1 -o tinyrace -pthread
mfrw@kp ...fpp/asgn/as2 % uname -a
Linux kp 4.4.33-1-MANJARO #1 SMP PREEMPT Fri Nov 18 18:06:44 UTC 2016 x86_64 GNU/Linux
mfrw@kp ...fpp/asgn/as2 % gcc --version
gcc (GCC) 6.2.1 20160830
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

mfrw@kp ...fpp/asgn/as2 % ./tinyrace 
FATAL: ThreadSanitizer: unexpected memory mapping 0x55e38776b000-0x55e38776c000
mfrw@kp ...fpp/asgn/as2 % 
4

2 回答 2

1

是的,这是由于内核的变化,它不是 GCC 特定的,clang 暴露了相同的行为。

GCC 跟踪器中有一个相应的错误,它引用了上游的修复。评论提到内核 4.1+,但我在 3.16 上遇到了这个问题。

正如 Peter Teoh 在回答中提到的,如果您省略 pie/pic 选项,它可能会起作用,但正确的修复是在较新的编译器使用的较新的线程清理程序中(在 2016 年 9 月之后,但尚不清楚 GCC 6.x 分支是否得到了使固定)。

于 2017-07-20T15:05:39.653 回答
1

这与您的编译选项有关: -pie -fPIC

如果我编译了您的代码(在 Ubuntu 16.04 中,最新更新):

g++ -fsanitize=thread -pie -fPIC tinyrace.c -g -O1 -o tinyrace -pthread

我会得到同样的错误。

但如果改为:

g++ -fsanitize=thread tinyrace.c -g -O1 -o tinyrace -pthread

然后打印竞争条件警报:

./tinyrace 
==================
WARNING: ThreadSanitizer: data race (pid=12032)
  Write of size 4 at 0x00000060108c by thread T1:
    #0 thread(void*) /home/tteikhua/tinyrace.c:5 (tinyrace+0x000000400a5d)
    #1 <null> <null> (libtsan.so.0+0x0000000230d9)

  Previous write of size 4 at 0x00000060108c by main thread:
    #0 main /home/tteikhua/tinyrace.c:11 (tinyrace+0x000000400ab1)

  Location is global 'global' of size 4 at 0x00000060108c (tinyrace+0x00000060108c)

  Thread T1 (tid=12034, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x000000027577)
    #1 main /home/tteikhua/tinyrace.c:10 (tinyrace+0x000000400aa7)

SUMMARY: ThreadSanitizer: data race /home/tteikhua/tinyrace.c:5 thread(void*)
于 2017-07-17T00:19:38.577 回答