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