e472.c

領域が確保されていない引数使用


原作: char *func() { char *cp ; set_str_memory(&cp) ; memcpy(cp, "SET", 4) ; return cp ; }
修正案: char *func() { char *cp = NULL ; set_str_memory(&cp) ; memcpy(cp, "SET", 4) ; return cp ; }
解説: 本警告は、メモリ操作関数の使用において、 メモリ未確保の可能性がある変数を引数とした際に出力されます。 この例では、 変数 cp を NULL で初期化せずに set_str_memory 関数を呼んでおり、 set_str_memory 関数が有無を言わさずメモリを確保しない限り、 cp がメモリ確保済みであるかどうかの判定が難しくなっています。 詳細: set_str_memory 関数は概ね次のように実装されるでしょう。 void set_str_memory(char **pp) { if ( pp == NULL || *pp != NULL ) { return ; } *pp = (char*)malloc(sizeof(char) * 1024) ; if ( *pp == NULL ) { project_exit("malloc failed.") ; } (*pp)[0] = '¥0' ; } 最初の if 文で *pp が NULL で無い場合、 未初期化のゴミ領域であるか、正しく malloc されたメモリ領域であるか、 追求せずに return しています。