【问题标题】:Why does compiler not give a warning in this case为什么在这种情况下编译器不给出警告
【发布时间】:2013-06-02 18:29:02
【问题描述】:

这段代码:

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

编译器在编译过程中没有给出任何警告,但进程因分段错误而失败 但是当我编译下面的代码时

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

编译器给出以下警告

警告:传递 'memcpy' 的参数 2 使指针从整数不进行强制转换 [默认启用]

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

还有一些编译器标志会对此类代码发出警告

【问题讨论】:

  • 你对这段代码的意图是什么?因为您似乎正在尝试执行memset(buff,0,255)memset(buff,2,255)
  • 是的,这就是编写这段代码的人的意图。令人惊讶的是,代码在 2 年内没有失败并且对我来说失败了。所以我试图重现一个我没有得到 memcpy( 不成功) 段错误的情况。这导致了我发布的问题

标签: c memcpy


【解决方案1】:

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.

正如这里 cmets 其他地方所提到的,如果您通过 -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)

【讨论】:

    【解决方案2】:

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

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

    memcpy() 的上下文中,传递空指针没有意义,但编译器不会对每个可能的无意义函数调用发出警告。
    尤其是在 C 语言中,您应该编写有意义的代码。

    【讨论】:

    • 实际上,如果您启用-Wnonnull,GCC 会发出一个
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多