GCC -Wuninitialized не предупреждает о неинициализированных структурах - PullRequest
1 голос
/ 14 ноября 2010
#include <ctime>
#include <iostream>
#include <cstring>
int main()
{

struct tm tm ;
//memset(&tm, 0, sizeof(struct tm));
strptime("1 Jan 2000 13:00:00", "%d %b %Y %H:%M:%S", &tm);
time_t t =mktime(&tm);
std::cout << ctime(&t);
return 0;
}

g ++ -Wuninitialized -O2 test.cpp не предупреждает о том, что tm не инициализирован. Valgrind делает, пока строка memset не будет добавлена. страницы руководства для strptime в Linux говорят, что его следует инициализировать, и я видел случайные даты в более сложной программе, пока не инициализировал ее. Существуют ли какие-либо флаги GCC, которые будут выдавать предупреждение в этих обстоятельствах?

1 Ответ

2 голосов
/ 14 ноября 2010

GCC не может заглянуть в уже скомпилированный код функций strptime, mktime и ctime во время компиляции.Вы просто передаете адрес структуры из точки вызова, ничего не читая.Valgrind, с другой стороны, выполняет вашу программу и отслеживает всю память и проверит, есть ли чтение перед записью определенного блока памяти, и, таким образом, может сообщить вам.

Если эти функции будут определены встроенными взаголовок, у вас может быть шанс, что компилятор может встроить их и отследить адрес указателя обратно до неинициализированной структуры.Тем не менее, я не проверял, насколько хорош GCC (или вообще, компиляторы).

...