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

问题描述:

你们知道为什么AddressSanitizer会采取一整套不同的库。AddressSanitizer使用不同的标准库吗? (C编程)

例如,我试图重新创建strcmp,当我将输出与string.h中的标准strcmp进行比较时,我意识到通常使用gcc编译它会输出差异,但使用-fsanitize =地址标志添加它给我1,0,-1输出。

GCC和铛行为相同的方式

我在OSX 10.11.6,顺便说一句。 MACOS或其他系统具有这种独特的行为是否具有相似的效果?

顺便说一句,从我读的时候,GNU C库的strcmp输出的差异和苹果版本只有输出1,-1和0. 所以这更令我费解,因为gcc MACOS中的/ clang似乎默认使用gnu libc,并在使用-fsanitize = address标志时以某种方式转移到Apple的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

'gcc'和'clang'在macOS Sierra(和Mac OS X)上的行为方式相同,原因是它们是同一个程序。运行'gcc --version'和'clang --version',你就会看到。该程序基于Clang而不是GCC。您可能会发现使用'gcc -v'(或'clang -v')运行,并且使用或不使用'-fsanitize = address'选项显示发生了什么。我不知道为什么使用不同的库。任何取决于strcmp()返回的数据的代码最终都会被破坏 - 你不应该在乎它是否返回-1或-90来区别差异。 –

+0

我明白,但我担心的是,如果-sanitize = address实际上是在切换库,显然这似乎在做什么,它还有什么改变。 – capitan

-fsanitize=address力的二进制文件,反对其超载很多的标准功能(包括strcmp)阿三运行链接。重载是为了检查这些函数的输入参数。 Asan的实现通常是符合标准的,但不遵循特定平台的所有nits,所以这可能是你看到差异的原因。