Дезинфицирующее средство для памяти

Я играю с Memory Sanitizer с Clang 3.7.0 на Ubuntu 14.04. Следующий код работает отлично:

#include <cstdio>

int main() {
double ans;
printf("Hello World: %f\n", ans);

return 0;
}

при компиляции с

 clang++ -g -O1 -fsanitize=memory -fsanitize-memory-track-origins=2 -fomit-frame-pointer sanitize.cpp -o sanitize

Я ожидал ошибки. Разве Memory Sanitizer не улавливает тот факт, что ans не был инициализирован?

Спасибо за вашу помощь.

5

Решение

Из документации Clang Santitizer ясно, что он имеет дело только с чтениями из унифицированной памяти из динамически распределенной памяти. Автоматическая память не является частью санитарных проверок.

5

Другие решения

Вам не нужно никакого Sanitizer, чтобы поймать эту ошибку. Компилятор может выяснить эту ошибку во время компиляции (sanitizers и valgrind работают во время выполнения). Фактически, все GCC Clang и ICC будут предупреждать этот код, если вы включите предупреждения. Это конкретное предупреждение контролируется с -Wuninitialized флаг. Как правило, рекомендуется всегда использовать высокий уровень предупреждения. Я бы порекомендовал следующую комбинацию флагов предупреждений, особенно при изучении языка:

-Wall -Wextra -pedantic

Если вы получили некоторые ложные срабатывания, только после тщательной проверки, что они действительно ложные, вы можете отключить определенные предупреждения. Нет причин не использовать флаги предупреждения. Некоторые проекты даже используют -Werror флаг, превращающий все предупреждения в ошибки.

1

Valgrind memcheck может быть опцией для определения неинициализированных значений стека.

Документация Valgrind:

Для неинициализированных значений, происходящих из блока кучи, Memcheck показывает, где был выделен блок. Для неинициализированных значений, происходящих из выделения стека, Memcheck может сказать вам, какой функции было присвоено значение, но не более того — обычно она показывает исходное местоположение открывающей скобки функции. Поэтому вы должны тщательно проверить, что все локальные переменные функции инициализированы правильно.

Ссылка:
http://valgrind.org/docs/manual/mc-manual.html

0
По вопросам рекламы [email protected]