在C代码中找到"漏洞"

Viv*_*idD 5 c static-analysis switch-statement

在我正在研究的产品中发现了几个令人讨厌的错误,这些错误都与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;
   }
Run Code Online (Sandbox Code Playgroud)

这是一个带有漏洞的代码:

   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;
   }
Run Code Online (Sandbox Code Playgroud)

Gro*_*roo 4

如果您使用 GCC,则应该使用Wimplicit-fallthrough编译器选项来生成失败警告。-Werror您也可以使用(ie对于此特定警告)将其设置为错误-Werror=implicit-fallthrough

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

如果您的编译器版本不支持此类选项,也许您可​​以编写自己的正则表达式,该正则表达式将匹配所有case未以先前语句为前缀的 s case,尽管您必须小心确保正则表达式匹配所有出现的情况,无论格式如何/评论。

例如,您可以使用类似的东西(这是一个演示):

(?# 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)
Run Code Online (Sandbox Code Playgroud)

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