Какие инструменты могут сообщать о таком использовании неинициализированных переменных?

Рассмотрим следующую программу

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)?

1

Решение

Сканирование предоставленного примера

$ 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.
2

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

Я много читал об инструменте PVS-Studio. Надо ловить такие предупреждения. К сожалению, это не бесплатно, но, по крайней мере, вы можете попробовать демо, чтобы проверить, работает ли он достаточно хорошо для вас.

0

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