Молчание запись параметров valgrind(buf) указывает на неинициализированные байты

#c #pointers #malloc #valgrind

Вопрос:

У меня есть код на C, как показано ниже (минимальный воспроизводимый пример):

 BYTE *myPointer; doStuff(amp;myPointer); //mallocs space and sets myPointer to point to this space   FILE* myFile = fopen(fileName, "rb "); fseek(myFile, 0, SEEK_SET);  fwrite(myPointer, 32, 1, myFile); //lt;------- problematic line  

теперь этот код работает и делает то, что должен, но valgrind выдает следующую ошибку в строке fwrite(myPointer, 32, 1, myFile); :

 Syscall param write(buf) points to uninitialised byte(s)  

и я думаю, это потому, что Valgrind считает, что myPointer неинициализирован.

Это справедливо, но внутри функции doStuff я выделяю пространство и устанавливаю myPointer, чтобы указать на него, поэтому все работает так, как ожидалось.

Есть ли какой-то способ, которым я могу сообщить вальгринду об этом/заставить замолчать ошибку?

Спасибо

Комментарии:

1. Вы, должно быть, делаете это неправильно, иначе valgrind не стали бы жаловаться, что он неинициализирован. Опубликуйте код doStuff() .

2. Недостаточно выделить память, вам также необходимо инициализировать содержимое памяти. Вы заполнили по крайней мере 32 байта?

3. ах ладно, большое спасибо, я думаю, что с Достаффом что-то не так (), я еще немного покопаюсь в этом, не думал, что валгринд не стал бы жаловаться иначе!

4. используйте calloc, и память будет инициализирована

Ответ №1:

fwrite Функция используется для записи данных в файл. Это означает (в данном случае), что myPointer ожидается, что он будет указывать на 32 байта данных, которые будут записаны на диск.

Это, конечно, проблема, потому что если doStuff не заполнять точки памяти myPointer , то эти байты на самом деле будут неинициализированы.

Предполагая, что вы действительно хотите прочитать из файла, используйте fread вместо этого.

 fread(myPointer, 32, 1, myFile);  

Если вы действительно хотите писать, убедитесь, что по крайней мере 32 байта, которые myPointer указывают, были фактически установлены в какое-то значение.

Комментарии:

1. получил это большое спасибо, я действительно хочу написать, поэтому я думаю, что это что-то не так с функцией doStuff ()! Опубликую свой результат здесь, когда я это выясню 🙂