стандартное и бесплатное использование

Я пытаюсь этот код:

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 и бесплатно?

Спасибо

0

Решение

Я собираюсь угадать GetImei а также SetImei тонкие обертки над полем типа char*, Если это так, то free вызов освобождает память, которая поддерживает char* значение. Отсюда и призыв к GetImei после того, как свободный доступ к освобожденной памяти и, следовательно, имеет неопределенное поведение

1

Другие решения

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 может быть перезаписан (вне границ), после этого все ставки выключены.

1

Я вижу несколько очевидных проблем:

  1. Возвращаемое значение strstr(start,","); игнорируется, что делает этот вызов функции бесполезным
  2. end никогда не инициализируется внутри Found_imei функция, поэтому указатель арифметики l=end-start-5; приводит к неопределенному поведению
  3. strncpy не всегда заканчивается нулем его вывод. Это может легко привести к тому, что вы уйдете с конца строки в неопределенное поведение.
  4. Вы проходите в l в качестве параметра длины strncpy когда вы на самом деле должны передавать размер буфера минус 1. Если l 40 или более, вы будете копировать слишком много символов в str и разбить свой стек.

Я подозреваю, что проблемы 1 и 2 являются результатом неудачного копирования + вставки вашего точного кода, так как похоже, что вы намеревались написать end = strstr(start,",");, но я не могу быть уверен. Тем не менее, проблемы 3 и 4 остаются серьезными проблемами.

1
По вопросам рекламы [email protected]