【发布时间】:2017-09-01 11:54:52
【问题描述】:
在我正在开发的产品中发现了几个令人讨厌的错误,所有这些错误都与 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;
}
【问题讨论】:
-
你应该研究一下statical analysis和linter这两个术语。
-
您的两个示例都有“失败”-案例
0失败到案例1。无论如何,如果您想检测此类事情,请编写一些代码来解析您的源文件,并在您想要的条件不满足时尖叫。 C 编译器通常不会诊断此类事情,因为代码是有效的 - 所以你自己编写代码来做。 -
这很奇怪,我还没有找到任何不涵盖此的静态分析工具。基本上自从它们被发明以来,它就一直是 C 语言的一部分。这就是为什么在预期会发生故障的情况下使用像
/*FALLTRHOUGH*/这样的 cmets 很常见的原因,因此 linter 可以检查这一点。这些天我主要使用clang-analyzer,没有检查它是否默认启用,但我确定它必须存在一个开关。 -
“静态”不是一个词。它只是“静态的”。
-
您可以编写一个 GCC 插件(或 GCC MELT 扩展)来执行您想要的额外检查。
标签: c switch-statement static-analysis