我正在完成我的安全字符串检索功能,并决定将我的编译器警告向上看,看看我的代码是否有任何标志。
目前,我在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
指针?答案 0 :(得分:1)
只是为了说明我的观点:
#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()函数将几乎消失。 (检查反汇编输出)。