2017-02-09 1 views
3

gcc에 대해 -fsanitize = thread의 사용법을 테스트하고 예기치 않은 메모리 매핑이 발생했는지 확인하려고합니다. 커널에 약간의 변경이 있었을 수 있습니다. . 작동하도록 할 수있는 일이 있습니까?예상치 못한 메모리 맵에 대해 불평하는 스레드 살균제

이것은 내가 뭐하는 거지입니다 ...

그것은 당신의 컴파일 옵션과 함께 할 것입니다
[email protected] ...fpp/asgn/as2 % 
[email protected] ...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; 
} 
[email protected] ...fpp/asgn/as2 % g++ tiny.cpp -fsanitize=thread -pie -fPIC -g -O1 -o tinyrace -pthread 
[email protected] ...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 
[email protected] ...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. 

[email protected] ...fpp/asgn/as2 % ./tinyrace 
FATAL: ThreadSanitizer: unexpected memory mapping 0x55e38776b000-0x55e38776c000 
[email protected] ...fpp/asgn/as2 % 
+0

현재 동일한 쓰레기가 있습니다. 솔루션을 찾고 있습니다. –

+0

나를 위해, 그것은 오래된 커널과 함께 일했다 ... 나는 커널 2.6.32와 함께 고대 서버를 가졌다. 아마 커널과 함께 뭔가를 가지고있을 것이다. – mfrw

+0

같은 이슈 : 우분투 17.04; 커널 버전 4.10.0-33- 일반; gcc 6.3.0. '-pie -fPIC'을 사용하지 않아도 문제가 해결되지 않습니다. 대답을 기다리고 .. – kaiwan

답변

1

: -pie -fPIC.

난과 (우분투 16.04, 최신 업데이트에) 코드를 컴파일하는 경우 :

g ++ -fsanitize = 스레드 -pie -fPIC tinyrace.c -g -O1 -o tinyrace -pthread

나도 같은 오류가 발생합니다.

그러나

로 변경하는 경우 :

g ++ -fsanitize = 스레드 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*) 
1

그래, 그것은 커널의 변화로 인한 것이지 GCC와 다르다. clang은 같은 행동을한다.

bug in GCC tracker이 있으며, fix in the upstream을 참조하십시오. 의견은 커널 4.1 이상을 언급하지만, 나는 3.16에서이 문제를 쳤다.

pi/pic 옵션을 생략해도 Peter Teoh의 대답에서 언급했듯이 적절한 수정은 새로운 컴파일러에서 사용되는 최신 스레드 새 니타 이저 (2016 년 9 월 이후이지만 GCC 6인지 여부는 확실하지 않습니다. x 지점에 수정 사항이 있음).