在realloc失败后自由悬挂对象警告

我正在完成我的安全字符串检索功能,并决定打开我的编译器警告,看看我的代码是否有任何标志.

目前我在Pelles C IDE上收到以下编译器警告:

stringhandle.c(39): warning #2800: Potentially dangling object 'str' used after call to function 'realloc'.
stringhandle.c(50): warning #2800: Potentially dangling object 'str' used after call to function 'realloc'.

这是我的功能(如果您希望在阅读代码之前完整阅读其中的问题,请阅读以下内容):

char *getstr(void)
{
    char *str,*tmp;
    int bff = STRBFF,ch = -1,pt = 0;

    if(!(str = malloc(bff)))
    {
        printf("\nError! Memory allocation failed!");
        return 0x00;
    }
    while(ch)
    {
        ch = getc(stdin);
        if (ch == EOF || ch == '\n' || ch == '\r') ch = 0;
        if (bff <= pt)
        {
            bff += STRBFF; 
            if(!(tmp = realloc(str,bff))) 
            {
                free(str);  //line 39 triggers first warning
                str = 0x00;
                printf("\nError! Memory allocation failed!");
                return 0x00;
            }
            str = tmp;
        }
        str[pt++] = (char)ch;
    }
    str[pt] = 0x00;
    if(!(tmp = realloc(str,pt)))
    {
        free(str); //line 50 triggers second warning
        str = 0x00;
        printf("\nError! Memory allocation failed!");
        return 0x00;
    }
    str = tmp;
    return str;
}

我想明白为什么我被警告说str可能会悬空.如果发生错误,我释放str指向的分配空间,但是我的函数在被释放后没有进一步调用str.作为一个修复,我只是尝试自由(str),然后str = 0x00.不应该让指针str不再晃来晃去吗?它与我的tmp指针有关吗?我也没有释放或将tmp设置为0x00,因为如果realloc失败,它应该已经是0x00.但是我应该在成功时将其设置为0x00,因为它在技术上仍然准确指向str并且不再需要它?

简而言之:

>为什么我的编译器警告str可能悬空?
>如何删除警告?
>我正确处理我的tmp指针吗?

解决方法

只是为了说明我的观点:

#include <stdio.h>
#include <stdlib.h>

static inline void * myrealloc(void *org,size_t newsize)
{
char * new;
new = realloc(org,newsize);
if (!new) {
        fprintf(stderr,"\nError! Memory allocation failed!\n");
        free (org);
        return NULL;
        }
return new;
}

char *getstr(void)
{
#define STRBFF 256

    char *str = NULL;
    size_t size,used ;

    for (size=used=0; ; ) {
        int ch;
        if (used >=size) {
            str = myrealloc(str,size += STRBFF);
            if(!str) return NULL;
        }
        ch = getc(stdin);
        if (ch == EOF || ch == '\n' || ch == '\r') ch = 0;
        str[used++] = ch;
        if (!ch) break;
    }
    str = myrealloc(str,used);
    return str;
}

现在,如果您的编译器支持内联,对myrealloc()的调用将被原始代码的等效替换,实际的myrealloc()函数将几乎消失. (检查反汇编输出).

相关文章

首先GDB是类unix系统下一个优秀的调试工具, 当然作为debug代...
1. C语言定义1个数组的时候, 必须同时指定它的长度.例如:int...
C++的auto关键字在C+⬑新标准出来之前基本...
const关键字是用于定义一个不该被改变的对象,它的作用是告诉...
文章浏览阅读315次。之前用C语言编过链表,这几天突然想用C+...
文章浏览阅读219次。碰到问题就要记录下来,防止遗忘吧。文章...