2013-06-02 31 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的整数,即使在指针上下文中也是如此。

相关问题