安全な文字列検索のために関数を完成させており、コンパイラの警告を上げて、コードのいずれかがフラグを立てているかどうかを確認することにしました。
現在、PellesCIDEで次のコンパイラ警告を受け取っています。
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
ポインタを正しく処理していますか?