2013-06-02 94 views
2

這段代碼:爲什麼編譯器不要在這種情況下,給予警告

 char buff[255]; 
     memcpy(buff,0,255); 

編譯器編譯過程中不發出任何警告,但該進程失敗分段故障 但是當我編譯如下代碼

 char buff[255]; 
     memcpy(buff,2,255); 

的編譯器會發出如下警告

警告:傳遞argume 「的memcpy」的NT 2時將整數指針沒有施放[默認啓用]

爲什麼編譯器沒有給出常量0 的警告我使用GCC 4.7.2版本

也有一些編譯器標誌會給出這樣的代碼警告

+2

你對這段代碼有何打算?因爲它幾乎看起來像你正在嘗試做一個'memset(buff,0,255)'或'memset(buff,2,255)' –

+0

這是編寫這段代碼的人的意圖。令人驚訝的是代碼沒有失敗2年,並在我身上失敗。所以我試圖重現一個案例,我沒有得到memcpy的seg錯誤(失敗)。這導致了我發佈的問題 – JRK

回答

13

0在指針上下文中使用時被隱式轉換爲空指針。 2不會隱式轉換爲指針類型,因此是警告。

您可以在comp.lang.c FAQ, section 5,特別是Question 5.2閱讀更多。

在一個快速測試在這裏,無論是GCC也不鏘警告的0情況下(沒有額外的標誌),但clang static analyzer做:

example.c:6:4: warning: Null pointer argument in call to memory copy function 
    memcpy(buff,0,255); 
    ^~~~~~~~~~~~~~~~~~ 
/usr/include/secure/_string.h:55:6: note: expanded from macro 'memcpy' 
    ? __builtin___memcpy_chk (dest, src, len, __darwin_obsz0 (dest))  \ 
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
1 warning generated. 

如已在註釋中提到其他地方在這裏,GCC會發出警告,如果傳遞-Wnonnull(還包括與-Wall):

$ gcc -Wnonnull example.c -o example 
example.c: In function ‘main’: 
example.c:6: warning: null argument where non-null required (argument 2) 
3

2不是一個指針;因此你會收到警告。

0是空指針,所以編譯器沒有看到任何錯誤的代碼。

memcpy()的上下文中,傳遞空指針沒有意義,但編譯器沒有針對每個可能的非感性函數調用的警告。
特別是在C中,您需要編寫有意義的代碼。

+3

實際上,如果啓用'-Wnonnull',GCC會發出一個 – qdii

1

因爲在指示器上下文0空指針常量,而2是類型爲int的整數,即使在指針上下文中也是如此。

相關問題