【问题标题】:Is there a way to get gcc or clang to warn on a missing 'else'?有没有办法让 gcc 或 clang 对丢失的“else”发出警告?
【发布时间】:2012-01-24 06:41:36
【问题描述】:

如果我没有处理每个 if 语句的 else 条件,我想让编译器警告我。这是否存在于 clanggcc 中?

澄清一下,我并不想为我的所有源代码启用此功能。但是,有时我根本无法不认真考虑每个单独的 else 块,因为设计是整个文件或大量代码。所以,我想,我真的在寻找一个可以打开和关闭的编译指示,以便为几千行非常重要的代码启用和禁用它。

把它想象成一个自动代码审查或静态分析工具。

说编译器不能这样做,因为它是合法的……在实践中不是问题。我见过的每一个 C/C++ 编译器都会很高兴地针对在语法和语义上完全有效的代码发出大量警告。 (例如在 gcc、-Wunused-value、-Wunused-label、-Wunreachable-code 等...)

【问题讨论】:

  • 嗯,大部分if 语句没有 else 子句。通过健康百分比,我的意思是在 30% 到 70% 之间。这样的警告会很愚蠢,会导致毫无意义的代码膨胀(else {} 在每个 if 子句的末尾)和噪音。
  • 我将在关于我的动机的问题中添加一个澄清性评论。
  • 任何包含throwbreakreturncontinueif 都有一个隐含的else:条件后面的其余代码。在这里要求一个显式的else 语句将是一个糟糕的要求。
  • 我不确定这些关键字中的任何一个如何影响 else,因为 if 块中的代码运行会要求else 不会阻止,反之亦然。

标签: c++ gcc syntax clang gcc-warning


【解决方案1】:

如果你真的想要这个,我可能会建议下载Cppcheck 并为此添加一个检查。 Cppcheck 执行简单类型的基于文本的匹配来检查规则集。警告缺少else 子句相当简单。

我在missing-else 分支中实现了“缺少其他”的原型检查:https://github.com/ghewgill/cppcheck/tree/missing-else。这通过了自己的测试,但由于新的意外样式警告(在其他合法代码上)而导致许多其他测试失败。

【讨论】:

  • 这是个好主意,但是,我也写了一个 C++ 解析器...我真的希望不必扩展我的工具包和我的工作流程。
  • @Will 我猜在这种情况下这将是明智的做法,并且在您的 make 文件中您可以指定要检查哪些文件。
  • @WillBradley:运行像 Cppcheck 这样的静态分析器还有很多其他好处。
  • 这可能是获得我想要的东西的唯一方法,但是将我自己的时间投入到这个工具上的成本对我来说是不值得的,所以从某种意义上说,这不是一个可以接受的答案.看起来真正的答案是“不”。 :-(
  • @GregHewgill:感谢您推荐查看 Cppcheck。很酷。
【解决方案2】:

编译器不能,一个简单的if() 是一个有效的条件语句。
编译器警告可能的语义错误,它们并不意味着拥有/提供调试工具。
要获得这些功能,您将不得不依赖一些专门为此目的而设计的代码分析工具。

【讨论】:

  • 他问的是警告,而不是错误。法律允许使用警告,例如不引用变量等。编译器肯定可以警告这些事情。
  • @NicolBolas:对于合法的事情允许警告。这是编译器根据用户在使用这些工具时大多出错的经验提供的附加工具。没有elseif 几乎不是这样的功能。如果编译器必须提供这样的功能,那么这个列表可能是无穷无尽的。
  • 没错,这个列表可能是无穷无尽的。但是,这不是那么荒谬。至少有一个带有注释的 else 块通常是一个好习惯,其中说 /* 我考虑过这个,它应该失败,或者什么也不做。 */
  • @WillBradley:谁说这是好习惯?在大多数情况下,从它应该通过的条件的性质来看是显而易见的。注释和else 子句只会占用空间。
  • 好的。对不起,你是对的。这并不总是最好的做法。我只是断言有时强制开发人员(包括自己)有意识地解决else条件是非常宝贵的。
【解决方案3】:

恐怕这样的检查只会引发大量警告,因为很多代码都没有使用 else 子句。但是如果你只是想检查你的代码,你可以使用这些小宏:

#define IF
#define THEN ?
#define ELSE :    

然后你就可以这样写你的代码:

int foo(bool flag)
{
    return IF(flag) THEN 0 ELSE -1;
}

当然这是个坏主意。

【讨论】:

  • 你猜怎么着?他们解决了这个问题,因为如果 ELSE 分支丢失,他们会产生错误。
  • 这还不足以取代if/else
  • 是的,它会带来大量警告,但在这种情况下我希望这样。正如我在修改后的问题中提到的那样,我不希望在某些翻译单元中,或者理想情况下在某些#pragma 区域中全面使用它。
猜你喜欢
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多