我继承了一个大型 C++ 代码库,我的任务是避免代码库中可能发生的任何空指针异常。是否有可用的静态分析工具,我想是 lint,您已经成功使用了。
您还注意哪些其他事项?
最佳答案
您可以从消除 NULL 的来源开始:
改变
if (error) {
return NULL;
}
进入
if (error) {
return DefaultObject; // Ex: an empty vector
}
如果返回默认对象不适用并且你的代码库已经使用了异常,那么做
if (error) {
throw BadThingHappenedException;
}
然后,在适当的地方添加处理。
如果您正在使用遗留代码,您可以创建一些包装函数/类:
ResultType *new_function() {
ResultType *result = legacy_function();
if (result) {
return result;
} else {
throw BadThingHappenedException;
}
}
新功能应该开始使用新函数并有适当的异常处理。
我知道有些程序员就是不会得到异常,包括像 Joel 这样的聪明人.但是,返回 NULL 最终发生的是这个 NULL 像疯了似的传递,因为每个人都会认为处理它并默默地返回不是他们的事。有些函数可能会返回错误代码,这很好,但调用者通常最终会返回另一个 NULL 来响应错误。然后,您会在每个函数中看到很多 NULL 检查,无论该函数多么微不足道。而且,只需要一个不检查 NULL 的地方就会使程序崩溃。异常会迫使您仔细考虑错误并准确决定应该在何处以及如何处理它。
您似乎只是在寻找简单的解决方案,例如静态分析工具(您应该始终使用)。更改指向引用的指针也是一个很好的解决方案。然而,C++ 具有 RAII 的优点,它消除了“try {} finally {}”无处不在的需要,因此我认为它值得您认真考虑。
关于c++ - 在大型 C++ 代码库中避免空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1180832/