Один из наших разработчиков обнаружил проблемы с 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 с лязгом 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 ничего не происходит.
Почему Clang в Linux не ловит эти ошибки и что мы можем сделать, чтобы найти эти проблемы как часть нашего процесса CI?