2017-02-09 20 views
3

gccの-fsanitize = threadの使用をテストしようとしていて、予期しないメモリマッピングの不平を言っています。その理由は、カーネルに若干の変更があり、 。それを機能させるために私ができることはありますか? -pie -fPIC予期せぬメモリマップを不快にするスレッドサニタイザ

これは、それはあなたのコンパイルオプションを指定して行うことです...私がやっている何

[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

同じ問題:Ubuntu 17.04;カーネルバージョン4.10.0-33-ジェネリック; gcc 6.3.0。 '-pie -fPIC'を使用しても問題は解決しません。答えを待っている.. – kaiwan

答えて

1

です。

私は(Ubuntuの16.04、最新のアップデートで)あなたのコードをコンパイルした場合:

グラム++ -fsanitize =スレッド-pie -fPIC tinyrace.c -g -O1 -o tinyrace -pthread

私は同じエラーが発生します。

しかし

に変更された場合:

グラム++ -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でこの問題が発生しました。

pie/picオプションを省略すると、Peter Teohの回答に記載されているように、適切な修正が新しいコンパイラで使用される新しいスレッドサニタイザにあります(2016年9月以降、GCC 6かどうかは不明です)。 xブランチが修正を得ました)。

関連する問題