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); <<<<<<<<<<<<<<<<< 
}

free 命令后,printf 出现错误。

我在使用 strdup 和 free 时犯了一些错误?

谢谢

4

3 回答 3

1

我会猜测 htatGetImei并且SetImei是 type 字段的薄包装器char*。如果是这种情况,那么free调用将释放支持该char*值的内存。因此,对 free 之后的调用GetImei正在访问已释放的内存,因此具有未定义的行为

于 2013-11-18T22:50:57.127 回答
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 可以被覆盖(越界),之后所有的赌注都被取消了。

于 2013-11-18T22:54:45.150 回答
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 仍然是严重的问题。

于 2013-11-18T22:56:38.397 回答