Рассмотрим следующую программу
struct X
{
int d;
X(){} // forget to initialize d
};
int main()
{
X x;
volatile int y=x.d; // read uninitialized d
(void)y; // (kill useless warning)
}
Понятно, что у него неопределенное поведение, которое я бы хотел в целом уловить, используя какой-либо инструмент отладки. Я пробовал cppcheck (используя их онлайн демо) а также g++ -fsanitize=address
так же как g++ -fsanitize=undefined
, а также valgrind
, Но эти инструменты не сообщают мне, что x.d
неинициализируется при чтении.
Какие инструменты я могу использовать, чтобы поймать такого рода неопределенное поведение (предпочтительно работающее в Linux)?
Сканирование предоставленного примера
$ more test.cpp
struct X
{
int d;
X(){} // forget to initialize d
};
int main()
{
X x;
volatile int y=x.d; // read uninitialized d
(void)y; // (kill useless warning)
}
с последней версией cppcheck (версия 1.72 dev) дает:
$ cppcheck --enable=all test.cpp
Checking test.cpp...
[test.cpp:4]: (warning) Member variable 'X::d' is not initialized in the constructor.
Я много читал об инструменте PVS-Studio. Надо ловить такие предупреждения. К сожалению, это не бесплатно, но, по крайней мере, вы можете попробовать демо, чтобы проверить, работает ли он достаточно хорошо для вас.