Я экспериментировал с Clang 6.0 Memory Sanitizer (MSan).
Код скомпилирован с
clang++ memsans.cpp -std=c++14 -o memsans -g -fsanitize=memory -fno-omit-frame-pointer -Weverything
в Ubuntu 18.04. Согласно документации MSan
Будет терпеть копирование неинициализированной памяти, а также простое
логические и арифметические операции с ним. В общем, MemorySanitizer
молча отслеживает распространение неинициализированных данных в памяти и
выдает предупреждение, когда ветвь кода берется (или не берется)
на неинициализированном значении.
Таким образом, следующий код не генерирует никаких ошибок
#include <iostream>
class Test {
public:
int x;
};
int main() {
Test t;
std::cout << t.x;
std::cout << std::endl;
return 0;
}
Но это будет
#include <iostream>
class Test {
public:
int x;
};
int main() {
Test t;
if(t.x) {
std::cout << t.x;
}
std::cout << std::endl;
return 0;
}
В идеале хотелось бы, чтобы оба этих примера кода генерировали какую-то ошибку, поскольку оба «используют» неинициализированную переменную в том смысле, что первая печатает ее. Этот код является небольшим тестовым кодом, и, следовательно, ошибка в первом коде очевидна, однако, если бы это была большая кодовая база с похожей ошибкой, MSan бы полностью пропустил это. Есть ли какой-нибудь взлом, чтобы заставить MSan также сообщать об этом типе ошибки?