我正在完成用于安全字符串检索的函数,并决定打开编译器警告,看看我的任何代码是否引发了任何标志。
目前,我在 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
在被释放后没有进一步的调用。作为修复,我只是尝试free(str)
做str = 0x00
. 那不应该使指针str
不再悬空吗?它与我的tmp
指针有关吗?我没有释放或设置tmp
为任何一个,因为如果失败0x00
它应该已经是。但是我是否应该将其设置为成功,因为它在技术上仍然准确地指出了哪里需要和不再需要?0x00
realloc
0x00
str
简而言之:
- 为什么我的编译器警告
str
可能悬空? - 如何删除警告?
- 我
tmp
是否正确处理了我的指针?