我正在尝试这段代码:
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时遇到了一些错误?
由于
答案 0 :(得分:1)
我要猜测htat GetImei
和SetImei
是char*
类型字段的瘦包装器。如果是这种情况,那么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)
我看到几个明显的问题:
strstr(start,",");
的返回值,使该函数调用无用end
永远不会在Found_imei
函数内初始化,因此指针算术l=end-start-5;
会导致未定义的行为strncpy
doesn't always null-terminate其输出。这很容易导致从字符串的末尾走出并进入未定义的行为。l
作为长度参数传递给strncpy
。如果l
是40或更多,你就要去将太多字符复制到str
并粉碎你的筹码。我怀疑问题1和2是由于未能复制+粘贴您的确切代码而造成的,因为看起来您打算写end = strstr(start,",");
,但我无法确定。然而,问题3和问题4仍然是严重的问题。