1

你们知道为什么 AddressSanitizer 会使用一组完全不同的库吗?

例如,当我将输出与 string.h 中的标准 strcmp 进行比较时,我试图重新创建 strcmp,但我意识到使用 gcc 正常编译它会输出差异,但添加了 -fsanitize=address 标志给我 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
4

1 回答 1

1

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

于 2017-06-27T09:34:56.867 回答