地址清理器仅在OS X上找到溢出

AddressSanitizer only finds overflow on OS X

本文关键字:溢出 OS 地址      更新时间:2023-10-16

我们的一位开发人员在他的机器(OS X(上发现了AddressSanitizer的问题,这些问题没有被我们的CI(Linux上的Jenkins(发现。

示例代码:

#include <vector>
#include <iostream>
int main() {
{
std::vector<int> tmp_vec{1, 2, 3};
tmp_vec.resize(1);
if(tmp_vec[1] == 123) std::cout << "#1" << std::endl;
}
}

带有 clang 6 的 OS X 上的输出:

==9387==ERROR: AddressSanitizer: container-overflow on address 0x6020000000f4 at pc 0x00010fb5e4aa bp 0x7ffee00a2b90 sp 0x7ffee00a2b88
READ of size 4 at 0x6020000000f4 thread T0
#0 0x10fb5e4a9 in main (a.out:x86_64+0x1000024a9)
#1 0x7fff7eaa7014 in start (libdyld.dylib:x86_64+0x1014)
[...]

在带有clang 6的Linux上,没有任何反应。

为什么 Linux 上的 clang 没有捕获这些错误,我们可以做些什么来发现这些问题作为 CI 过程的一部分?

要添加到mrks答案中,libstdc++默认情况下不会检测到容器溢出(因为它可能会导致来自Asan的误报警告,请查看wiki以获取更多详细信息(。您需要通过-D_GLIBCXX_SANITIZE_VECTOR显式启用它(您需要足够新的libstdc++(。

这与编译器或操作系统没有太大关系。如果两台计算机具有两个不同的 std 实现,则结果可能会有所不同。在 Linux 计算机上显式设置clang++-6.0 -stdlib=libc++ -fsanitize=address sanitizer.cpp会导致 ASan 发现相同的问题。

因此,CI 中的 clang 构建应显式使用libc++