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
答
-fsanitize=address
力的二进制文件,反对其超载很多的标准功能(包括strcmp)阿三运行链接。重载是为了检查这些函数的输入参数。 Asan的实现通常是符合标准的,但不遵循特定平台的所有nits,所以这可能是你看到差异的原因。
'gcc'和'clang'在macOS Sierra(和Mac OS X)上的行为方式相同,原因是它们是同一个程序。运行'gcc --version'和'clang --version',你就会看到。该程序基于Clang而不是GCC。您可能会发现使用'gcc -v'(或'clang -v')运行,并且使用或不使用'-fsanitize = address'选项显示发生了什么。我不知道为什么使用不同的库。任何取决于strcmp()返回的数据的代码最终都会被破坏 - 你不应该在乎它是否返回-1或-90来区别差异。 –
我明白,但我担心的是,如果-sanitize = address实际上是在切换库,显然这似乎在做什么,它还有什么改变。 – capitan