2013-11-18 1 views
0

Я пытаюсь этот код:strdup и свободное использование

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% вызвана чем-то там. –

ответ

1

Я собираюсь угадать Хтат 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); <<<<<<<<<<<<<<<<< 

ул могут быть перезаписаны (вне границ), после того, что все ставки выключены.

1

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

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

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