2

この関数は、ブール値を文字列に変換します。実行時のバグの可能性を指摘します。

#define TRUE  1
#define FALSE 0

char* bool2Str(boolean x)
{
char result[5];

if (x == TRUE)
strcpy(result, "TRUE");

if (FALSE == x) 
strcpy(result, "FALSE");

return &(result[0]);
}
4

3 に答える 3

11
  1. バッファ オーバーフロー: "FALSE" は 6 バイトであり、null ターミネータstrcpyは忠実に書き込みますが、5 分のスペースしかありません。
  2. 関数からのアドレスによってローカル一時が返され、返された値が使用できなくなります(NULLに対してテストする場合を除く)。
  3. 0 または 1 以外の値は、何も書き込みません。これは、他の 2 つのバグと比べると見劣りします。
于 2013-02-19T12:37:35.250 に答える
0

呼び出し元がこれを異なるブール値で 2 回呼び出した場合、同じ変数であるため (静的変数の場合)、2 回目の呼び出しで最初の呼び出しの結果が上書きされます。

ただし、その変数の結果は静的ではないため、呼び出し先はローカル変数を指すポインターを返そうとしますが、これはナノ秒で範囲外になります。これは通常、実行時エラー/バグの良い原因です。

また、私が正しければ (C の第一人者ではありません...)、strcpy (result,"FALSE")6 バイトをコピーすると、 5 つの要素 (インデックス 0 から 4) しか保持できませんresultresult

于 2013-02-19T12:41:26.277 に答える
0
  1. 配列結果のサイズが短すぎます - 少なくとも 6 にする必要があります
  2. 配列はスタック配列であってはなりません。静的配列または動的に割り当てられた配列である必要があります。
  3. Cにはブール型はありません。これはtypedefでしたか?
于 2013-02-19T12:38:29.903 に答える