【问题标题】:Force GCC to report a warning when casting a float pointer to int pointer?强制 GCC 在将浮点指针转换为 int 指针时报告警告?
【发布时间】:2019-10-09 11:56:14
【问题描述】:
void foo(uint32_t* p);

...
float32_t* x;
foo( (uint32_t*)x );

静态代码分析工具报告“casting from float* to integer*" 问题。

如何强制 GCC 编译器报告相同的警告?

编译器选项是: -pedantic -Wall -Wextra -Wconversion

【问题讨论】:

  • 不,-Wall不这样做...将此信息添加到问题中,谢谢。
  • 我不认为有一个编译器选项可以让程序员免于使用无意义的强制转换。
  • 为什么要在进行显式转换时收到警告?通过显式转换,您可以告诉编译器您想要更改您的类型。当用户明确表示这是他的意图时,无需发出警告。离开演员表,你会收到警告 (Wincompatible-pointer-types)。
  • 相关的,如果不是真正的欺骗:stackoverflow.com/questions/21214875/…
  • @Blaze 如果我输入我的个人 PIN 码,我可以从自动 ATM 机上获得明确的演员表吗? ;)

标签: c gcc


【解决方案1】:

通过使用显式转换(“强制转换”),您已经告诉编译器:“我绝对想这样做”。这就是演员表的意思。然后编译器发出警告是没有意义的。

相反,请依赖隐式转换,如果您尝试使用无效的转换,您的程序编译将失败,直到您修复它。

现在,这只会在您编写程序时帮助您。它不能帮助您静态分析已经存在的编写不佳的代码,以改进代码。好吧,没关系!正如您已经发现的那样,这就是您的,呃,静态分析器的用途。 ?

话虽如此,如果您启用了严格的别名,编译器执行自己的一些静态分析,并且可能会在此处发出警告,如果您的程序存在风险'无法按您的意愿工作。但是在 GCC 构建中经常禁用严格别名,即使没有,检测别名违规也很复杂,无法保证。

【讨论】:

  • 谢谢。我的机器上没有这个静态分析工具,它是一个存储库范围的夜间测试。不知道如何解决这个问题。 -Wstrict-aliasing=1没有帮助。
  • 我不确定我是否理解问题所在。您的夜间静态分析运行已发现问题。现在您可以通过重写代码来解决问题。你在寻求什么样的“帮助”?
  • @Danijel 注意-Wstrict-aliasing 单独不会做任何事情,它要求-fstrict-aliasing 也被启用。但这可能会破坏任何使用非标准别名技巧的代码。
  • gcc 的严格别名选项不是很可靠并且容易给出错误的诊断。
  • @Danijel 请注意,这不仅仅是打开警告。您应该让自己充分意识到打开此模式的后果。特别是,我想说像您在问题中使用的 any 类型转换示例现在应该替换为 memcpy 或类似名称;可能还有更微妙的例子。
【解决方案2】:

我怀疑你会找到你正在寻找的编译器选项。 (在我看来,您要查找的编译器选项不应该存在。)

通常的问题是:

我正在做一些奇怪的事情。我知道没关系,但编译器一直警告它。如何禁用警告?”

现在,如果您正在做的“奇怪的事情”是以潜在不安全的方式混合和匹配不兼容的指针,禁用警告的方法通常是:使用显式转换

因此,实际上,您要问的是一种方法来重新启用您(或某人)已经通过使用显式转换禁用的警告,毕竟您现在认为这种转换是错误的。

我们正处于无限倒退的风口浪尖。如果一种方法可以警告显式转换请求的可疑转换,那么下周我们会收到这个问题:

我正在使用名义上不兼容的指针之间的特殊转换。我知道这没关系,但编译器一直警告它,即使我使用的是显式强制转换。如何禁用警告?我需要使用两个演员表吗?”

这有点像警告信息。假设您尝试删除一个重要的系统文件。假设您的计算机弹出一个警告对话框,上面写着“即将删除重要文件。确认?”假设您决定不想删除它,但您不小心单击了“确定”按钮,文件就消失了。您是否发现自己希望警告对话框之后是 second 对话框,询问“您真的确定吗?”你可能会,但大多数人可能会同意,每次删除文件时都必须单击“确定”两次是不可接受的麻烦......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多