【问题标题】:strdup and free usagestrdup 和免费使用
【发布时间】:2013-12-02 07:14:50
【问题描述】:

我正在尝试这段代码:

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 时出错了?

谢谢

【问题讨论】:

  • 请发帖SetImeiGetImei,问题99%是由里面的东西引起的。

标签: c++ c free strdup


【解决方案1】:

我看到了几个明显的问题:

  1. strstr(start,","); 的返回值被忽略,使得该函数调用无用
  2. end 从未在 Found_imei 函数内部初始化,因此指针运算 l=end-start-5; 导致未定义行为
  3. strncpy doesn't always null-terminate 它的输出。这很容易导致离开字符串的末尾并进入未定义的行为。
  4. 您将l 作为长度参数传递给strncpy,而实际上您应该将缓冲区大小减去1。如果l 为40 或更多,您将复制太多字符进入str 并粉碎你的筹码。

我怀疑问题 1 和 2 是由于未能复制+粘贴您的确切代码造成的,因为看起来您打算编写 end = strstr(start,",");,但我不能确定。尽管如此,问题 3 和 4 仍然是严重的问题。

【讨论】:

    【解决方案2】:

    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 可以被覆盖(越界),之后所有的赌注都关闭了。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-30
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 2015-09-09
        • 1970-01-01
        • 2017-07-07
        相关资源
        最近更新 更多