天天看点

《C++编程调试秘笈》——第2章 什么时候捕捉缺陷2.1 为什么编译器是捕捉缺陷的最好场合

c++编程调试秘笈

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

如果在编译时捕捉缺陷与在运行时捕捉缺陷之间进行选择,只要有可能,都应该在编译时捕捉缺陷。这样做的理由有很多。首先,如果一个缺陷是被编译器所检测到的,我们将看到一条文本信息,准确描述了所发生的错误是什么,它是在哪里发生的,发生在哪个文件以及发生在哪一行。(作者在这里可能稍微有点乐观,因为在有些情况下,尤其是在涉及stl时,编译器所产生的错误信息是相当含糊的,需要花费精力才能推断出编译器实际所描述的含义。但是,编译器总是在不断地完善中,大多数情况下它们对问题的描述是相当清晰的。)

另一个理由是完整的编译(进行了最终链接)覆盖了程序中的所有代码。如果编译器没有返回错误或警告,就可以百分之百地确信程序中不存在编译时可以检测到的错误。但对于运行时测试,就不能做出这样的保证。当代码相当庞大时,很难保证所有可能的分枝都被测试到,也无法保证每一行代码都至少执行1次。

即使我们能够保证这一点,仍然不够。同一段代码对于一组输入可能正确地完成任务,但对于另一组输入可能无法正确地工作。因此,通过运行时测试,我们永远无法完全保证对所有东西都进行了测试。

最后还存在时间因素:我们在运行代码之前执行编译,因此如果在编译时捕捉到了错误,就可以节省时间。有些运行时错误是在程序的后期出现的,因此可能要等几分钟甚至几小时的运行之后才会发现一个错误。更糟的是,这种错误很可能是无法复制的,它可能以一种看上去随机的方式,在连续运行时出现并消失。相比之下,在编译时捕捉错误就简单得多!

继续阅读