Clang の AddressSanitizer を使用してプログラムをデバッグしているときに、奇妙な問題に直面しています。まったく同じコードが別の 64 ビット システムで機能しますが、別のシステムではヒープ バッファ オーバーフロー エラーが発生します。
両方のマシンは、同じツールチェーンなどを使用して同じオペレーティング システム (BSD 10 64 ビット) を実行します。 64 ビット システム上の 32 ビット アプリ。
問題はこの 1 つの呼び出しだけにあるため、表示するコードはあまりありません。
struct ifaddrs * ifAddrStruct = NULL;
getifaddrs(&ifAddrStruct);
そして、これは ASan によってダンプされたスタック トレースです。
==19706==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x2e603e78 at pc 0x0832bbb2 bp 0xffff3288 sp 0xffff2e60
READ of size 256 at 0x2e603e78 thread T0
#0 0x832bbb1 in memcpy /home/dim/llvm-3.8.0/final/llvm.src/projects/compiler-rt/lib/asan/asan_interceptors.cc:438:3
#1 0x2bdbed49 in getifaddrs (/usr/lib32//libc.so.7+0xecd49)
0x2e603e78 is located 0 bytes to the right of 1528-byte region [0x2e603880,0x2e603e78)
allocated by thread T0 here:
#0 0x8337df0 in __interceptor_malloc /home/dim/llvm-3.8.0/final/llvm.src/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:52:3
#1 0x2bdbe87f in getifaddrs (/usr/lib32//libc.so.7+0xec87f)
#2 0x8325799 in getifaddrs /home/dim/llvm-3.8.0/final/llvm.src/projects/compiler-rt/lib/asan/../sanitizer_common/sanitizer_common_interceptors.inc:4368:13
#3 0x8f1a443 in GetIPInfo(void) ...../src/config.cpp:243:2
#4 0x8f22837 in config_init(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) ...../src/config.cpp:329:7
#5 0xadf1cf9 in start(int, char**) (app+0xadf1cf9)
#6 0xade5a6c in main (app+0xade5a6c)
#7 0x82db629 in _start1 (app+0x82db629)
#8 0x82db4e7 in _start (app+0x82db4e7)
#9 0x0 (<unknown module>)
SUMMARY: AddressSanitizer: heap-buffer-overflow /home/dim/llvm-3.8.0/final/llvm.src/projects/compiler-rt/lib/asan/asan_interceptors.cc:438:3 in memcpy
Shadow bytes around the buggy address:
0x45cc0770: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x45cc0780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x45cc0790: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x45cc07a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x45cc07b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x45cc07c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00[fa]
0x45cc07d0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x45cc07e0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x45cc07f0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x45cc0800: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x45cc0810: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
両方のマシンでまったく同じ CFLAGS、同じコンパイラ (Clang 3.8)、同じライブラリ バージョンを使用しています。しばらく Google と StackOverflow を調べていましたが、同じ問題を抱えている人を他に見つけることができなかったため、これは孤立したケースのようです。
誰かがこの問題についてもっと知っていることを願っています。
私を助けてくれる人に前もって感謝します。
Edit1:すべてが正常に動作するシステム(64ビットシステムの64ビットアプリ)でClang 3.8.1を使用しているのに、他のシステムにはまだ3.8.0があることに気付きました。よくわかりませんが、現時点ではコンパイラのバグだと思います。関連するすべての 32 ビット ライブラリ (ASan など) を含む 3.8.1 へのアップグレードについては、ニュースがあるときに報告します。