strdup和免费使用

时间:2013-11-18 22:48:37

标签: c++ c free 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和free时遇到了一些错误?

由于

3 个答案:

答案 0 :(得分:1)

我要猜测htat GetImeiSetImeichar*类型字段的瘦包装器。如果是这种情况,那么free调用将释放支持char*值的内存。因此,在free之后调用GetImei访问释放的内存,因此具有未定义的行为

答案 1 :(得分: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可以被覆盖(越界),之后所有的赌注都将被取消。

答案 2 :(得分:1)

我看到几个明显的问题:

  1. 忽略strstr(start,",");的返回值,使该函数调用无用
  2. end永远不会在Found_imei函数内初始化,因此指针算术l=end-start-5;会导致未定义的行为
  3. strncpy doesn't always null-terminate其输出。这很容易导致从字符串的末尾走出并进入未定义的行为。
  4. 当你实际上要将缓冲区大小减去1时,你将l作为长度参数传递给strncpy。如果l是40或更多,你就要去将太多字符复制到str并粉碎你的筹码。
  5. 我怀疑问题1和2是由于未能复制+粘贴您的确切代码而造成的,因为看起来您打算写end = strstr(start,",");,但我无法确定。然而,问题3和问题4仍然是严重的问题。