AddressSanitizer только находит переполнение на OS X

Один из наших разработчиков обнаружил проблемы с AddressSanitizer на его компьютере (OS X), которые не были обнаружены нашим CI (Jenkins на 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)
[...]

На Linux с clang 6 ничего не происходит.

Почему лягушки в Linux не улавливают эти ошибки и что мы можем сделать, чтобы найти эти проблемы как часть нашего процесса CI?

2 ответа

Решение

Чтобы добавить в ответ mrks, libstdc++ по умолчанию не обнаруживает переполнение контейнера (так как это может вызвать ложные положительные предупреждения от Asan, проверьте вики для более подробной информации). Вы должны включить это явно через -D_GLIBCXX_SANITIZE_VECTOR (вам понадобится достаточно недавно libstdc++).

На самом деле это не имеет ничего общего с компилятором или ОС. Если две машины имеют две разные реализации std, результаты могут отличаться. Явная настройка clang++-6.0 -stdlib=libc++ -fsanitize=address sanitizer.cpp на машине Linux приводит к тем же проблемам, которые обнаруживает ASan.

В результате сборки Clang в CI должны явно использовать libc++,

Другие вопросы по тегам