Я пробую этот код:
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 и бесплатно?
благодаря
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
не всегда завершает нуль вывода. Это может легко привести к удалению конца строки и в Undefined Behavior.l
в качестве параметра длины strncpy
когда вам действительно нужно передать размер буфера минус 1. Если l
40 или более, вы собираетесь копировать слишком много символов в str
и разбивать свой стек. Я подозреваю, что проблемы 1 и 2 являются результатом неспособности скопировать + вставить ваш точный код, так как похоже, что вы намеревались написать end = strstr(start,",");
, но я не могу быть уверен. Тем не менее проблемы 3 и 4 по-прежнему являются серьезными проблемами.
Я собираюсь угадать, что GetImei
и SetImei
- тонкие обертки над полем типа char*
. Если это так, то free
вызов освобождает память, которая поддерживает значение char*
. Следовательно, вызов GetImei
после бесплатного доступа к свободной памяти и, следовательно, имеет неопределенное поведение
SetImei
иGetImei
, проблема на 99% вызвана чем-то там.