你们是否知道为什么AddressSanitizer将采用一组完整的库。
例如,当我将输出与string.h中的标准strcmp进行比较时,我试图重新创建strcmp,但我意识到通过gcc正常编译它会输出差异,但使用-fsanitize = address flag添加它给我1,0,-1输出。
gcc和clang的行为方式相同
我在OSX 10.11.6上,顺便说一句。 MACOS或其他系统的这种行为是否具有类似的效果?
顺便说一下,根据我的阅读,GNU C库的strcmp输出差异,Apple版本只输出1,-1和0。 所以这对我来说更令人费解,因为MACOS中的gcc / clang似乎默认使用gnu libc,并且在使用-fsanitize = address标志时以某种方式转移到苹果公司的libc版本。
如果有人能向我解释这一点,我将非常感激。 顺便说一句,以防万一,这是我的gcc配置:
➜ gcc --version
Configured with:
--prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.38)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
答案 0 :(得分:1)
-fsanitize=address
强制你的二进制文件链接Asan运行时,它会重载许多标准函数(包括strcmp)。执行重载以检查这些函数的输入参数。 Asan实现通常符合标准,但不遵循特定平台的所有尼特,因此这可能是您看到差异的原因。