Parallel processing 线程消毒剂抱怨意外内存映射

Parallel processing 线程消毒剂抱怨意外内存映射,parallel-processing,linux-kernel,g++,compiler-specific,Parallel Processing,Linux Kernel,G++,Compiler Specific,我试图测试gcc的-fsanize=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; } in

我试图测试gcc的-fsanize=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 % 
mfrw@kp…fpp/asgn/as2%
mfrw@kp…fpp/asgn/as2%cat tiny.cpp
#包括
int全球;
空心*螺纹(空心*x){
全球=42;
返回x;
}
int main(){
pthread_t;
pthread_创建(&t,NULL,thread,NULL);
全球=43;
pthread_join(t,NULL);
回归全球;
}
mfrw@kp…fpp/asgn/as2%g++tiny.cpp-fsanize=thread-pie-fPIC-g-O1-o tinyrace-pthread
mfrw@kp…fpp/asgn/as2%uname-a
Linux kp 4.4.33-1-MANJARO#1 SMP抢占周五11月18日18:06:44 UTC 2016 x86_64 GNU/Linux
mfrw@kp…fpp/asgn/as2%gcc--版本
通用条款(gcc)6.2.1 20160830
版权所有(C)2016免费软件基金会。
这是自由软件;有关复制条件,请参见源。没有
担保甚至不是为了适销性或适合某一特定目的。
mfrw@kp…fpp/asgn/as2%。/tinyrace
致命:ThreadSanitizer:意外的内存映射0x55e38776b000-0x55e38776c000
mfrw@kp…fpp/asgn/as2%

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

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

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

我会得到同样的错误

但如果改为:

g++-fsanize=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*)
/tinyrace
==================
警告:ThreadSanitizer:数据争用(pid=12032)
线程T1在0x00000060108c处写入大小为4的数据:
#0线程(void*)/home/tteikhua/tinyrace.c:5(tinyrace+0x000000400a5d)
#1(libtsan.so.0+0x0000000230d9)
主线程以前在0x00000060108c处写入大小为4的数据:
#0 main/home/tteikhua/tinyrace.c:11(tinyrace+0x000000400ab1)
位置在0x00000060108c处为大小为4的全局“全局”(tinyrace+0x00000060108c)
主线程在以下位置创建的线程T1(tid=12034,正在运行):
#0 pthread_create(libtsan.so.0+0x000000027577)
#1 main/home/tteikhua/tinyrace.c:10(tinyrace+0x000000400aa7)
摘要:ThreadSanitarizer:data race/home/tteikhua/tinyrace.c:5线程(无效*)

是的,这是由于内核中的更改,并且不是特定于GCC的,clang暴露了相同的行为

有一个对应的,它引用。评论中提到了内核4.1+,但我在3.16中遇到了这个问题


正如Peter Teoh在回答中提到的,如果省略pie/pic选项,可能会起作用,但正确的修复方法是更新的编译器使用的更新的线程清洗剂(2016年9月之后,但不清楚GCC 6.x branch是否得到了修复)。

目前也得到了同样的垃圾。也在寻找解决方案。对我来说,它与一个旧的内核一起工作。。。我有一个内核为2.6.32的古老服务器,所以可能它的内核也有相同的问题:Ubuntu 17.04;内核版本4.10.0-33-generic;gcc 6.3.0。不使用'-pie-fPIC'不能解决问题。等待答复。。