在大型c ++代码库中避免空指针异常

kal*_*kal 4 c++ null nullpointerexception

我继承了一个大的c ++代码库,我有一个任务,以避免代码库中可能发生的任何空指针异常.是否有可用的静态分析工具,我在想,你已经成功使用了.

你还有什么其他的东西?

Dav*_*Lin 6

您可以从消除NULL源开始:

更改

if (error) {
    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

if (error) {
    return DefaultObject; // Ex: an empty vector
}
Run Code Online (Sandbox Code Playgroud)

如果返回的默认对象不适用且您的代码库已经使用了异常,请执行

if (error) {
    throw BadThingHappenedException;
}
Run Code Online (Sandbox Code Playgroud)

然后,在适当的位置添加处理.

如果您正在使用遗留代码,您可以创建一些包装函数/类:

ResultType *new_function() {
    ResultType *result = legacy_function();
    if (result) {
        return result;
    } else {
        throw BadThingHappenedException;
    }
}
Run Code Online (Sandbox Code Playgroud)

新功能应该开始使用新功能并具有适当的异常处理.

我知道一些程序员不会得到例外,包括像Joel这样的聪明人.但是,通过返回NULL最终发生的事情是,这个NULL会像疯了一样传递,因为每个人都会认为处理它并静默返回并不是他们的事.某些函数可能会返回错误代码,这很好,但是调用者通常最终会返回NULL-another-NULL以响应错误.然后,无论函数多么微不足道,您都会在每个函数中看到很多NULL检查.并且,只需要一个不检查NULL以使程序崩溃的地方.例外情况迫使您仔细考虑错误并确定应该在何处以及如何处理错误.

您似乎只是在寻找简单的解决方案,例如静态分析工具(您应该经常使用).更改引用指针也是一个很好的解决方案.但是,C++具有RAII的优点,它无需在任何地方"尝试{}",所以我认为值得您认真考虑.