AddressSanitizer仅在OS X上发现溢出

时间:2018-06-24 16:08:39

标签: c++ clang++ address-sanitizer

我们的一位开发人员发现他的计算机(OS X)上的AddressSanitizer问题没有被我们的CI(Linux上的詹金斯)捕获。

示例代码:

#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;
    }
}

在OS X上使用clang 6的输出:

==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流程的一部分,我们怎么做才能找到这些问题?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

因此,配置项中的clang构建应显式使用libc++