Следующий код (в src.cpp
) использовался для экспериментов с Clang's Memory Sanitizer (MSan)
#include <iostream>
#include <vector>
int add(int x, int y) {
int sum;
sum = x + y;
return sum;
}
int main() {
if(add(10, 20) > 0) {
std::cout << "Greater";
}
std::cout << std::endl;
return 0;
}
Мы ясно видим, что sum
унифицирован и может привести к неопределенному поведению. Согласно MSan Github Wiki
MemorySanitizer является точным битом: он может отслеживать неинициализированные биты в
битовый. Это будет терпеть копирование неинициализированной памяти, а также
простые логические и арифметические операции с ним. В общем,
MemorySanitizer молча отслеживает распространение неинициализированных данных в
памяти и выдает предупреждение, когда берется ветвь кода (или нет
принято) в зависимости от неинициализированного значения.
Очевидно, что это соответствует этому варианту использования, поскольку ветвь if
будет взята на основе начального значения sum
. Однако при запуске этого кода, скомпилированного с
, не отображается сообщение об ошибке / предупреждение.
clang++ -fsanitize=memory -fsanitize-memory-track-origins -O0 -std=c++14 src.cpp -o src
Clang 6.0 используется в Linux x86_64.