为什么编译器在这种情况下不会发出警告

时间:2013-06-02 18:29:03

标签: c memcpy

这段代码:

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

编译器在编译期间不会发出任何警告,但是该过程因分段错误而失败 但是当我编译以下代码时

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

编译器发出以下警告

  

警告:传递'memcpy'的参数2使得整数指针没有强制转换[默认启用]

为什么编译器不会给常量0发出警告 我正在使用GCC版本4.7.2

还有一些编译器标志会为这样的代码提供警告

3 个答案:

答案 0 :(得分:13)

在指针上下文中使用时,

0会隐式转换为空指针。 2并未隐式转换为指针类型,因此警告。

您可以在comp.lang.c FAQ, section 5阅读更多内容,特别是Question 5.2

在这里的快速测试中,GCC和Clang都没有警告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.

正如此处其他评论中所述,如果您通过-Wnonnull(也包含在-Wall中),GCC会发出警告:

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

答案 1 :(得分:3)

2不是指针;因此你会收到警告。

0是空指针,因此编译器看不到该代码有任何问题。

memcpy()的上下文中,传递空指针没有意义,但编译器没有对每个可能的非语义函数调用发出警告。
特别是在C语言中,您需要编写有意义的代码。

答案 2 :(得分:1)

因为指针上下文中的0空指针常量,而2是类型int的整数,即使在指针上下文中也是如此。