AddressSanitizer是否使用不同的标准库? (C编程)

时间:2017-06-27 00:52:21

标签: clang address-sanitizer

你们是否知道为什么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

1 个答案:

答案 0 :(得分:1)

-fsanitize=address强制你的二进制文件链接Asan运行时,它会重载许多标准函数(包括strcmp)。执行重载以检查这些函数的输入参数。 Asan实现通常符合标准,但不遵循特定平台的所有尼特,因此这可能是您看到差异的原因。