Может ли Valgrind ловить все виды неопределенного поведения? - PullRequest
4 голосов
/ 09 августа 2011

Другими словами, могу ли я быть уверен, что моя программа не имеет определенного поведения, если она работает без каких-либо сообщений об ошибках Valgrind?

Ответы [ 3 ]

4 голосов
/ 09 августа 2011

После компиляции программы определяется ее поведение. Если вы хотите обнаружить неопределенное поведение, вам нужно начать раньше в цепочке инструментов.

Неопределенное поведение означает, что реализация компилятора должна решать, как реализовать поведение, стандарт не диктует, каким должно быть поведение. Другими словами, имеет смысл только спрашивать о UB для исходного кода, а не для скомпилированного кода.

4 голосов
/ 09 августа 2011

Здесь есть фундаментальная ошибка.

Valgrind не является своего рода инструментом статического анализа, который понимает семантику грамматики C ++ и, следовательно, знает, когда вы вызываете Неопределенное поведение , как указано C ++ Standard .

Valgrind - это инструмент, который, однако, будет предупреждать вас всякий раз, когда вы выполняете в памяти операции, которые являются результатом неопределенного поведения вашегопрограмма.Например, он будет обнаруживать всякий раз, когда вы обращаетесь к нераспределенной или освобожденной памяти, он обнаруживает, когда вы совершаете системный вызов с неинициализированным (или частично унифицированным) значением / буфером и т. Д. ...

Чтобы провести медицинскую аналогиюValgrind обнаруживает симптомы из неопределенного поведения .Отсутствие симптомов не означает отсутствие неопределенного поведения .

Более того, поскольку Valgrind только проверяет только выполняемый код, он оставляет некоторый «код» без проверки.

Избавление от Неопределенное поведение чрезвычайно сложно.Если ваша программа нетривиальна, она, вероятно, будет эквивалентна решению проблемы остановки.Однако это не должно помешать вам принять меры предосторожности:

  • Включить предупреждения компилятора: -Wall -Werror - это данность, -Wextra отлично (дополнительно) для новых кодовых баз ( Elementary *)1031 *)
  • Используйте инструменты статического анализа (некоторые из них, поскольку они не сообщают об одних и тех же проблемах), Clang Static Analyzer, Purify и т. Д. ( Good Practice )
  • Запустите Valgrind на расширенном тестовом наборе (вы можете использовать gcov для проверки покрытия) ( Хорошая практика )
  • Прочитайте несколько стандартов кодирования,и подумайте об их совете (не применяйте их ни в коем случае), Саттер на первом месте, Высококачественный CPP или MISRA намного строже и обширнее.Некоторые инструменты автоматического просмотра кода могут проверять такой набор правил.(Приятно и полезно на личном уровне)

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

4 голосов
/ 09 августа 2011

Одним словом: нет. Ничто, даже Вальгринд, не идеально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...