gpt4 book ai didi

c - 在 C 代码中查找 "fallthroughs"

转载 作者:太空狗 更新时间:2023-10-29 15:00:08 26 4
gpt4 key购买 nike

在我正在开发的产品中发现了几个讨厌的错误,所有这些错误都与 switch 语句中的无意“失败”有关。

现在,我想更进一步 - 我想检测大量 C 代码中的 switch 语句失败。 我只能使用 Linux 和 gcc 5.6 进行编译(所以没有 clang 或更新的 gcc;这是因为我们项目的目标架构不存在更新的 gcc)。

这是一段没有失败的代码:

    switch(m_loadAnimSubCt){
case 0:
case 1:
// Do something
break;
case 2:
case 3:
case 4:
// Do something
break;
}

这是一个有漏洞的代码:

   switch(m_loadAnimSubCt){
case 0:
case 1:
// Do something but fall through to the other cases
// after doing it.
case 2:
case 3:
case 4:
// Do something else.
break;
}

最佳答案

如果您使用 GCC,您应该使用 Wimplicit-fallthrough compiler option为 fallthroughs 生成警告。您也可以使用 -Werror 将其变为错误(即 -Werror=implicit-fallthrough 用于此特定警告。

我更喜欢使用 -Wextra(包括这个和许多其他额外的警告),但如果这是一些大型遗留代码库,它可能会产生太多噪音。它您应该争取的目标,通过-Wextra -Wpedantic -Werror 构建。

如果您的编译器版本不支持这样的选项,也许您可​​以编写自己的正则表达式来匹配所有未以先前的 case 语句为前缀的 case,尽管您必须小心确保正则表达式匹配所有匹配项,无论格式/注释如何。

例如,您可以使用这样的东西(这里是 demo ):

(?# match any 'case' following 'break;', ':' or '{' into a non-capturing group)
(?# then match the remaining 'case' into a named "fallthrough" group)
(?:(break;|:|{)[\r\n\s]*case) | (?<fallthrough>case)

因此,您可以针对您的文件夹运行 perl(或 python,或其他)脚本,并转储捕获“fallthrough”组的所有行。

关于c - 在 C 代码中查找 "fallthroughs",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45999771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com