c параметр linux stat указывает на неинициализированные байты? - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть цикл, проверяющий измененное время файла для выполнения ввода-вывода.Я использую команду stat.Valgrind выдает сообщения об ошибках неинициализированных байтов .. только что не так?Я убедился, что список имен файлов не равен нулю, и файлы существуют, прежде чем передать их в качестве параметров, но ошибка сохраняется.

for (i = 0; i < fcount; i++) {
    if (modTimeList[i] == 0) {
        int statret = 0;
        if(fileNameList[i]!=NULL)
        statret = stat(fileNameList[i], &file_stat);  // error 
        if (statret == -1) {
            printf(" stat error at %d", i);
        } else {
            modTimeList[i] = file_stat.st_mtime;
            // process
        }
    } else {
        int statret2 = 0;
        if(fileNameList[i]!=NULL)
        statret2 = stat(fileNameList[i], &file_stat); // error
        if (statret2 == -1) {
            printf(" stat error at %d", i);
        } else {
            if (modTimeList[i] < file_stat.st_mtime) {
                // process
            }
        }

    }

}

Сообщение об ошибке

==5153== Syscall param stat64(file_name) points to uninitialised byte(s)
==5153==    at 0x40007F2: ??? (in /lib/ld-2.7.so)
==5153==    by 0x804992B: stat (in /home/)
==5153==    by 0x8049559: checkForFiles (in /home)
==5153==    by 0x804983F: main (in /home)
==5153==  Address 0xbe9271d0 is on thread 1's stack
==5153==  Uninitialised value was created by a stack allocation
==5153==    at 0x804924C: checkForFiles (in /home/)
==5153==

Decleration

char fileNameList[100][256];

Я инициализирую имена файлов следующим образом

sprintf(inputPath, "find -name %s*.ext", filename);
        fpop = popen(inputPath, "r");
        while (fgets(inputPath, sizeof(inputPath) - 1, fpop) != NULL) {
            strcpy(fileNameList[fcount], trimwhitespace(inputPath));
            fcount++;
        }
        pclose(fpop);

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Поскольку fileNameList объявлено как:

char fileNameList[100][256];

if (fileNameList[i] != NULL) всегда будет истинным, поскольку fileNameList[i] не является нулевым указателем.Вы должны изменить чек на:

if ('\0' != *fileNameList[i]) /* Check if empty string. */

Но, чтобы это работало, вам нужно инициализировать fileNameList:

char fileNameList[100][256] = { { 0 } };
1 голос
/ 28 февраля 2012

Если вы сначала не инициализировали массив filename, его содержимое будет не нулями, а чем-то другим (часто это 0xCC, но может отличаться в разных системах / архивах / и т. Д.).

...