C/C++ if/for 之后没有大括号,如何将其删除?

M.K*_*.K. 6 c c++ cppcheck

当 if/for 语句后只有一行代码,没有大括号时,有没有办法通过 linting(或者可能seding/ ing)来摆脱或找到这些令人讨厌的情况?regexp像这个:

if(condition)
    return;
Run Code Online (Sandbox Code Playgroud)

作为参考,为什么我想摆脱它 - 这个线程中给出了很多原因:

在单行 if 或循环中使用大括号(即 {})的目的是什么?

我维护一些遗留代码,并处理其他人的一些未真正完成的代码,并且在调试时时不时会发现这种代码风格像绊线一样工作的情况:

if(condition_for_early_return)
    LOG("Im here")   // surprise surprise, I just broke control logic
    return;
Run Code Online (Sandbox Code Playgroud)

另外,我见过这样的代码:

if(condition)
<tabs>   do_smth();
<spaces> do_smth_else();
Run Code Online (Sandbox Code Playgroud)

当然if只包含first do_smth(),编译器不会混淆。但由于这些do_功能在视觉上是一致的,我想知道这是预期的行为还是在遗留代码中从未发现的错误。

我知道cppcheck没有抓住这些情况 - 已经尝试过了。你有办法自动发现这些陷阱吗?

Har*_*ith 12

海湾合作委员会有:

\n

-Wmisleading-indentation(仅限 C 和 C++)

\n
\n

当代码缩进未反映块\n结构时发出警告。具体来说,对于带有不使用大括号的受保护语句的 if、else、while 和\nfor 子句发出警告,\n后跟具有相同缩进的不受保护语句。

\n

在以下示例中,如果受到 \xe2\x80\x9cif\xe2\x80\x9d 条件的保护,则对 \xe2\x80\x9cbar\xe2\x80\x9d 的调用会被误导性缩进\nas。

\n
\n
  if (some_condition ())\n    foo ();\n    bar ();  /* Gotcha: this is not guarded by the "if".  */\n
Run Code Online (Sandbox Code Playgroud)\n
\n

在混合制表符和空格的情况下,警告使用-ftabstop= \n 选项来确定语句是否对齐(默认为 8)。

\n

对于涉及多行预处理器\n逻辑(例如以下示例)的代码,不会发出警告。

\n
\n
  if (flagA)\n    foo (0);\n#if SOME_CONDITION_THAT_DOES_NOT_HOLD\n  if (flagB)\n#endif\n    foo (1);\n
Run Code Online (Sandbox Code Playgroud)\n
\n

在 #line 指令之后不会发出警告,因为这\n通常表示自动生成的代码,并且无法对该指令引用的文件的布局做出\n任何假设。

\n
\n

请注意,此警告是由C 和 C++ 中的-Wall启用的。

\n
\n

或者,clang-format 提供:

\n

-InsertBraces(布尔值) clang-format 15

\n
\n

在 C++ 中的控制语句(if、else、for、do 和 while)后面插入大括号,\n除非控制语句位于宏定义内或者\n大括号将括起预处理器指令。

\n
\n

但同时也发出警告:

\n
\n

将此选项设置为 true 可能会导致错误的代码格式\n,因为 clang-format\xe2\x80\x99s 缺乏完整的语义信息。因此,\n应格外小心地检查此选项所做的代码更改。

\n
\n


Seb*_*edl 4

快速谷歌显示 SonarSource 的 linter 有一个规则: https: //rules.sonarsource.com/cpp/RSPEC-121

我相信有一种方法可以在某种程度上免费使用这个工具,所以它应该有效。

或者,clang-format 支持从 v15 开始添加它们的选项:https://clang.llvm.org/docs/ClangFormatStyleOptions.html#insertbraces