Valgrind сообщает об условном переходе или перемещении в зависимости от неинициализированных значений, но я не понимаю, почему - PullRequest
1 голос
/ 29 апреля 2020
const char path[] = "./folderidonthave";
struct stat stat_path;
stat(path, &stat_path);

if ( S_ISDIR(stat_path.st_mode) ) {
  return 1;
}
return 0; 

Я до сих пор не могу понять, почему у Valgrind есть проблема с этим, потому что кажется, что условная переменная инициализирована.

Ответы [ 2 ]

3 голосов
/ 29 апреля 2020

Учитывая имя пути, к которому вы пытаетесь stat, это кажется совершенно очевидным: stat() завершается неудачно, а объявленный вами struct stat stat_path остается неинициализированным, поэтому ваш if будет переходить на неинициализированные данные.

Проверьте возвращаемое значение stat() на наличие ошибок:

int res;

res = stat(path, &stat_path);
if (res != 0) {
    // Handle the error somehow.
    perror("stat failed");
    return 0; // Return something appropriate here.
}

if (S_ISDIR(stat_path.st_mode))
    return 1;

return 0;

Или, более компактно (при условии, что вы хотите трактовать ошибку так же, как "не каталог"):

return !stat(path, &stat_path) && S_ISDIR(stat_path.st_mode);
2 голосов
/ 29 апреля 2020

Что будет, если вызов на stat не удастся? Valgrind проверит это и при (вероятном) сбое вызова увидит ваш stat_path как «нетронутые» (неинициализированные) данные. Добавление фиктивного списка инициализатора в объявление позаботится об этом:

    struct stat stat_path = {0,};

И не забудьте проверить возвращаемое значение из функции stat, чтобы увидеть, удалось ли это:

if (stat(path, &stat_path) != 0) {
    // Error-handling...
}
//...
...