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

0

Я пробую этот код:

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

благодаря

  • 1
    Пожалуйста, SetImei и GetImei , проблема на 99% вызвана чем-то там.
Теги:
free
strdup

3 ответа

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 не всегда завершает нуль вывода. Это может легко привести к удалению конца строки и в Undefined Behavior.
  4. Вы передаете l в качестве параметра длины strncpy когда вам действительно нужно передать размер буфера минус 1. Если l 40 или более, вы собираетесь копировать слишком много символов в str и разбивать свой стек.

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

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню