【问题标题】:Is there any way to get gcc or clang to warn on explicit casts?有没有办法让 gcc 或 clang 对显式强制转换发出警告?
【发布时间】:2012-05-06 07:31:42
【问题描述】:

我要做的是在我拥有的一些源文件中找到从 double 或 float 类型到任何其他类型的所有显式转换。是否有内置的 gcc 方法可以做到这一点? 语言是C。 谢谢!

【问题讨论】:

  • 也许我只是简单,但您不能在您的源中搜索(double) 或(float) 吗?
  • @RobertHarvey 抱歉,我将其改写为更有意义。我想捕获从浮点/双精度类型到其他任何类型的所有显式转换,因此我可以搜索 (int) 等。但我无法判断它们是浮点型还是双精度型。
  • 只是一个想法(我不知道 C++ 或者它是否可能):重写 double 和 float 的强制转换运算符以发出编译失败并编译为 C++ :)
  • @pmg 这听起来很有趣,但我对如何开始这样做知之甚少。
  • @user1071861:我问是否有可能:stackoverflow.com/questions/10320282/…

标签: c gcc compiler-construction clang


【解决方案1】:

如果您的 C 代码也可以在 C++ 模式下编译,您可以使用 g++ 的 -Wold-style-cast 警告标志来触发所有此类转换的警告。

您可以通过使用其-Weverything 开关来确定 Clang 是否有任何将针对特定编码模式触发的警告(但请注意,这对于几乎任何其他目的都没有用——clang 具有默认禁用警告触发各种形式的合法代码)。但是,在这种情况下,clang 没有任何在此类强制转换时触发的警告。

【讨论】:

    【解决方案2】:

    由于强制转换是明确合法的,并且是执行奇怪转换的正确方法,gcc 不太可能包含警告它们的选项

    相反,根据您的来源有多大,您可能能够侥幸逃脱:

    grep '\(double|float\) ' *
    

    为您提供所有的双精度或浮点变量。由于 c 不是常规语言,因此将其解析为双精度或浮点变量列表并非易事(使用 shell 工具),但如果您的源代码足够小,则手动执行此操作很容易。

    grep '([^()]*)[ ()]*\(your list of variable names\)' *
    

    从那里将向您展示您的许多演员表。

    【讨论】:

      【解决方案3】:

      -Wconversion 对可能改变值的隐式转换发出警告(double 是大类型),-Wno-sign-conversion 禁用有关有符号和无符号整数之间转换的警告(因此会减少不必要的警告)。否则我没有看到任何标准的替代方案......

      在最坏的情况下,您可以直接在源文件中查找这些关键字...

      【讨论】:

      • 据我了解,显式转换不会被 -Wconversion 捕获,实际上它们是摆脱警告的一种方式。我做了几个测试,发现这也是正确的,所以我需要找到其他方法。
      • 不幸的是,它们被显示了(至少在我几个月前尝试的时候)。我已启用-Wconversion 来捕获意外 转换,而显式(和预期)转换产生的噪音量令人难以忍受。
      【解决方案4】:

      虽然我知道的编译器没有这方面的选项,但 Gimpel 的 FlexeLint 可以满足您的需求:

      $ cat tst.c
      int main (void)
      {
          int i = 0, j = 0;
          float f = 0.0;
          double d = 0.0;
      
          i = (int) f;
          j = (int) d;
          d = (double) f;
          f = (float) d;
          i = (int)j;
          j = (unsigned) i;
          return (int) j;
      }
      
      $ flexelint -w1 +e922 tst.c
      FlexeLint for C/C++ (Unix) Vers. 9.00j, Copyright Gimpel Software 1985-2012
      
      --- Module:   tst.c (C)
                     _
          i = (int) f;
      tst.c  7  Note 922: cast from float to int
                     _
          j = (int) d;
      tst.c  8  Note 922: cast from double to int
                        _
          d = (double) f;
      tst.c  9  Note 922: cast from float to double
                       _
          f = (float) d;
      tst.c  10  Note 922: cast from double to float
      
      shell returned 4
      

      【讨论】:

        【解决方案5】:

        嗯,我认为没有这样的选择。毕竟,编译器会发出警告,以警告您可能无意中所做的事情。然而,显式转换基本上是一种告诉编译器“闭嘴,我知道我在做什么”的方法。

        【讨论】:

        • 我担心的不是浮动或双打,而是 FROM 浮动和其他任何东西的双打。我为所有演员创建了一个列表,但我需要从该列表中提取只有浮点数或双精度数的变量名,我发现这很难做到。
        • 哪种类型的演员在这里有问题?如果它们有问题,为什么它们首先出现在代码中?
        • @cli_hlt: 存在错误的代码,你知道的,需要修复得更好:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多