前几天我正在用 c++ 编写一个函数,我突然想到编译器可以做更多的事情来帮助我防止错误。我的代码的要点是这样的 -
void method(SomeType* p)
{
assert(p != 0);
p->something();
}
它被称为这样
SomeType p = NULL;
if (SomeCondition)
{
p = some_real_value;
}
method(p);
显然 p 在运行时可能为空,因此在调试构建中方法的断言失败。我的错。
然而,编译器似乎有可能在编译时发现了这一点并发出警告说它已经检测到它发现了可能违反断言的可能性。
好的,这是一个简单的例子,编译器很容易根据程序的一些流分析和跟踪每个点的可能变量范围来发现指针在该点可能为 NULL。
我知道确定是否会违反许多断言可能太困难了,但即使编译器能够告诉我我已经编写了可能违反断言的代码,它也会帮助我程序更安全。
我认为它也有助于解决数组索引中的一个错误之类的问题,例如在循环中:-
assert(index >= 0 && index < array_size);
我认为在许多情况下,编译器可以在编译时证明索引变量可能超出这些范围并在编译时发出警告。
我意识到这对于编译器来说可能是太多的工作,但也许有一些工具可以执行这种分析?我无法用谷歌找到任何东西,但我想知道这种东西是否存在?或者,做得好到可能有用是不是太难了?