Я пытаюсь этот код:
imei=Found_imei(pClient->GetBuffer());
printf("6. CODICE IMEI %s \n",imei);
pClient->SetImei(imei);
printf("6.1 CODICE IMEI %s \n",pClient->GetImei());
free(imei); <<<<<<<<<<<<<<
printf("6.2 CODICE IMEI %s \n",pClient->GetImei());
где
char *Found_imei(char *string)
{
char *start;
char *end;
char str[40];
int l;
start=strstr(string,"imei:");
strstr(start,",");
l=end-start-5;
strncpy(str,start+5,l);
str[l]='\0';
return strdup(str); <<<<<<<<<<<<<<<<<
}
После свободной команды в printf произошла ошибка.
Я делаю некоторые ошибки в использовании strdup и бесплатно?
Спасибо
Я собираюсь угадать GetImei
а также SetImei
тонкие обертки над полем типа char*
, Если это так, то free
вызов освобождает память, которая поддерживает char*
значение. Отсюда и призыв к GetImei
после того, как свободный доступ к освобожденной памяти и, следовательно, имеет неопределенное поведение
char *end;
используется l=end-start-5;
до его инициализации.
таким образом
l=end-start-5;
strncpy(str,start+5,l); // god knows how far this goes. more than 40 easy
str[l]='\0'; // and here
return strdup(str); <<<<<<<<<<<<<<<<<
str может быть перезаписан (вне границ), после этого все ставки выключены.
Я вижу несколько очевидных проблем:
strstr(start,",");
игнорируется, что делает этот вызов функции бесполезнымend
никогда не инициализируется внутри Found_imei
функция, поэтому указатель арифметики l=end-start-5;
приводит к неопределенному поведениюstrncpy
не всегда заканчивается нулем его вывод. Это может легко привести к тому, что вы уйдете с конца строки в неопределенное поведение.l
в качестве параметра длины strncpy
когда вы на самом деле должны передавать размер буфера минус 1. Если l
40 или более, вы будете копировать слишком много символов в str
и разбить свой стек.Я подозреваю, что проблемы 1 и 2 являются результатом неудачного копирования + вставки вашего точного кода, так как похоже, что вы намеревались написать end = strstr(start,",");
, но я не могу быть уверен. Тем не менее, проблемы 3 и 4 остаются серьезными проблемами.