Ошибка сегментации fwrite - неверное чтение размера 4 - PullRequest
3 голосов
/ 25 ноября 2011

Это сводит меня с ума, поэтому любая помощь будет оценена.

Я занимаюсь разработкой программы, которая сканирует точки доступа Wi-Fi и управляет ими с различными функциями.Один из них - сохранить список точек доступа в файл, другой - прочитать точки доступа из файла и добавить их в текущий список.Точки доступа хранятся в связанном списке, где «p» содержит информацию об одной точке доступа (mac, mode, encrypted, essid и т. Д.), А «next» - указатель на следующий узел.

Вот часть функции, которую я использую для сохранения:

void store_info_in_file(list l)
{
 list aux;
 aux = l;
 FILE *file;
 ..
 ..
 //After opening the file with a name chosen by the user,it traverses 
 //the list and with casts to char, saves each part of each access point.

 //Conversion to char to ease storage in a binary file.

 char essid_len = (char)strlen((aux->p).essid);
 char enc = (char)(aux->p).encrypted; //originally an int

 fwrite(&essid_len,1,1,file);//i'm guessing the size is sizeof(char) now

И то же самое для всех частей.Анализируя вывод файла с помощью шестнадцатеричного редактора, я вижу, что данные были сохранены правильно.

Это проблематичная часть функции чтения: (я читаю первый символ [количество точек доступа, содержащихся вфайл] и сохраните его для последующего преобразования в int).

 //new_apns is for later use, when i will fread the rest of the file at once.
 char new_apns;
 ////wifi_collector_list.c:1103
 fread(&new_apns,1,1,fp);

Это вызывает ошибку сегментации из-за неверного чтения размера 4. Вот вывод для:

"valgrind --leak-check = full --show-достижимый = yes --track-originins = yes ./app"

http://pastebin.com/LAwsCV11

Редактировать: Я определенно глуп, я написал:

 fp = fopen(string,"rb");
 if(fp != NULL)
 {
  //fread here
 }

И почему-то изменил его на:

 if(fopen(string,"rb"))
 {
  //fread here, so yes, it's null...
 }

1 Ответ

3 голосов
/ 25 ноября 2011
==21328== Invalid read of size 4
==21328==    at 0x40D8F35: fread (iofread.c:43)
==21328==    by 0x804F043: add_info_from_file (wifi_collector_list.c:1103)
...
Address 0x0 is not stack'd, malloc'd or (recently) free'd
        ^^^

Это огромный намек на то, что fp равно NULL во время fread.Может быть, вы не проверяли это, когда fopen редактировали?

...