2013-02-19 83 views
2

該函數將布爾值轉換爲字符串。 指出可能的運行時錯誤。在C函數中發現錯誤

#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]); 
} 
+3

以下是其中一個提示:包含5個字符的字符串需要多長時間_really_? – 2013-02-19 12:36:40

+0

你最終解決了嗎?實際上,它不屬於這裏,因爲它是毫無疑問的......嗯,首先在ANSI-C中沒有布爾值,其次當複製「FALSE」到緩衝區並從棧中返回指針時,分配的變量是致命的! – 2013-02-19 12:37:47

+0

Offtopic:作業標籤的定義:作業是在後臺執行的一個進程,或者計劃在稍後執行 – banuj 2013-02-19 12:39:53

回答

11
  1. 緩衝區溢出:「FALSE」是6個字節包括空終止其strcpy會忠實地寫,但這裏只有空間5.
  2. 局部臨時由地址從函數返回,使返回的值是不可用的(除非用NULL來測試它)。
  3. 0或1以外的值不會寫入任何內容。與其他兩個錯誤相比,這種情況很糟糕。
0
  1. 陣列結果的尺寸太短 - 它應該至少爲6
  2. 陣列不應該是一個堆疊陣列。它需要是一個靜態數組或一個動態分配的數組。
  3. 沒有布爾類型是C.是否是typedef?
0

那麼,如果調用者使用不同的布爾值調用兩次,第二次調用將覆蓋第一次調用的結果,因爲它是相同的變量(如果它是靜態的)。

但是,該變量結果不是靜態的,因此被調用者試圖返回一個指向局部變量的指針,該變量超出了納秒級的範圍,這通常是運行時錯誤/錯誤的良好來源。

另外,如果我是對的(不是C大師...),strcpy (result,"FALSE")複製六個字節到resultresult只能容納五個元素(索引0到4)。