我正在完成我的安全字符串检索功能,并决定打开我的编译器警告,看看我的代码是否有任何标志.
目前我在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()函数将几乎消失. (检查反汇编输出).