如何静态检测由于代码更改而引入的错误?

How to statically detect bugs that are being introduced because of a code change?

我有一个主要用 C 语言编写的大型代码库,其中包含几个枚举。最近我修改了一个枚举,它产生了重大影响,因为我有点 "mis"-估计了影响。 有一个枚举看起来像这样:-

typedef enum en_e_type
{
ENUM_VAL_1 = 1,
ENUM_VAL_2 = 2,
ENUM_VAL_3 = 3,
ENUM_VAL_MAX = 4,
}en_e;

这已更改为

typedef enum en_e_type
{
ENUM_VAL_1 = 1,
ENUM_VAL_2 = 2,
ENUM_VAL_3 = 3,
ENUM_VAL_MAX = ENUM_VAL_3 ,
}en_e;

我们可以看到ENUM_VAL_MAX的值被修改了。 我的代码中有一些断言看起来像这样

ASSERT (in_value < ENUM_VAL_MAX )

还有一些 if 条件是这样的 :-

if (in_val < ENUM_VAL_MAX)

我们一直期待 in_value < ENUM_VAL_MAX,随着新枚举的改变,asserts 和 if 条件应该相应地修改,但其中一些被遗漏了,因此出现了问题。

我的问题是,识别这类错误的最佳方法是什么?是否有一些静态分析器工具可以查看代码差异并相应地分析其影响?对于前。在这种情况下,是否有一种工具可以将我指向这些 if/assert 条件(通过静态解析代码)并发出一些警告?我查看了 Helgrind,但它似乎没有帮助。

您可能不想听到这个,但是:

  1. 断言应该基于记录的行为。在这种情况下,枚举值上方应该有一个摘要,说明 ENUM_VAL_MAX 大于前面的任何值。

  2. 重构时,始终右键单击 -> 检查引用(大多数 IDE 都有此选项)并滚动浏览它。您会在概览中看到使用它的代码行,因此您会检测到比较。