【问题标题】:Why Clang isn't generating any warnings for an incompatible casting?为什么 Clang 不会为不兼容的转换生成任何警告?
【发布时间】:2017-12-21 04:03:04
【问题描述】:

我正在尝试用 gcc 和 clang 编译一个简单的code。 gcc 会为无法比较的强制转换生成警告(太棒了!)。但是,clang 没有产生任何警告!我为两者传递了相同的论点:

cc -Wall -Wextra tmp3.c
gcc -Wall -Wextra tmp3.c

我是否将所有必要的选项传递给 clang 编译器或遗漏了什么? clang documentation 帮助不大!

代码:

int main(void)
{
    void *b = (void *)0x12345678;
    int   a = (int)(unsigned long)b;
    int   c = (int)b;
    return a + c;
}

Clang 3.8 版

【问题讨论】:

  • 你为什么期望发出警告?
  • 查找您可能不知道的警告的最佳方法是-Weverything。这个选项(仅在 Clang 上,遗憾的是)实际上会打开每个警告。你是对的,文档不是很有帮助。
  • @Siguza:为什么不呢?这是任何编程语言的任何编译器中最基本的东西——不兼容的转换的警告!
  • @KyleStrand:我不知道-Weverything,谢谢分享。它没有产生必要的警告,而是给了我:tmp3.c:7:2: warning: no newline at end of file [-Wnewline-eof] 到目前为止,clang 给我留下了深刻的印象!
  • @DavidJohn 我会同意“不兼容的分配”以及“任何明显错误的东西”,但演员通常两者都不是,正如 (int)(unsigned long) 的唯一需要所证明的那样。通过显式转换,您基本上可以告诉编译器您知道自己在做什么。

标签: c clang cc


【解决方案1】:

我已经联系了 clang 开发者(邮件列表)。我收到了这样的回复:

在C++模式下,Clang报错就行了,和大家一样。在 C 中 然而,在模式下,转换通常更宽松。在这个 在这种情况下,我怀疑 Clang 也应该生成此警告。它会 不过可能需要打补丁。

【讨论】:

    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 2010-09-20
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多