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

第2章 什么时候捕捉缺陷

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

2.1 为什么编译器是捕捉缺陷的最好场合

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

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

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

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

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

时间: 2024-10-11 19:07:44

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

《C++编程调试秘笈》——第1章 C++的缺陷来自哪里

第1章 C++的缺陷来自哪里 C++编程调试秘笈 C++语言是非常独特的.虽然实际上所有的编程语言都从其他语言中吸收了一些思路.语法元素和关键字,C++却是吸收了另一种完整的语言,即C语言.事实上,C++语言的创建者Bjarne Stroustrup原先把他的新语言命名为"带类的C".这意味着如果我们已经使用了一些C代码,并且由于某种原因(例如科研或贸易)切换到一种面向对象的语言,就不需要在移植代码方面采取任何措施,只要安装新的C++编译器,就可以对旧的C代码进行编译了,并且效果和原先

《C++编程调试秘笈》导读

前言 C++编程调试秘笈 敏锐的读者可能会根据本书的英文书名<Safe C++>推断出C++编程语言多少是有点儿不安全的.这确实是很灵敏的感觉!并且非常正确.C++语言可能导致程序员出现所有类型的错误,例如访问一个动态分配的数组边界之外的内存,或者从那些从未初始化过的内存进行读取,或者分配了内存但忘了销毁它.简而言之,程序员在使用C++进行编程的时候,会有很大的几率搬起石头砸自己的脚.很可能一切都非常顺利,程序却突然崩溃,或者产生不可理喻的结果,或者出现了计算机术语中称为"不可预料的

《C++编程调试秘笈》——2.3 处理类型的正确方式

2.3 处理类型的正确方式 C++编程调试秘笈现在,如果我们创建一个Time类,在内部实现中隐藏了从什么时间开始,以及用什么时间单位(秒.毫秒等)进行测量等细节,上面这些杂七杂八的问题就可以轻松得以避免.这种方法的一个优点是如果我们错误地传递了其他日期数据,而不是传递了时间(现在用Time类型表示),编译器马上就能捕捉到这种错误.这种方法的另一个优点是,如果Time类当前是用毫秒实现的,并且以后为了提高精度用微秒表示,我们只需要编辑一个类,修改内部实现的细节,而不会影响其余的代码. 因此,我们怎

《C++编程调试秘笈》——2.2 怎样用编译器捕捉缺陷

2.2 怎样用编译器捕捉缺陷 C++编程调试秘笈现在我们应该已经坚信,只要有可能,就尽量在编译时捕捉错误.但是,怎样才能实现这个目标呢?让我们观察一对例子. 第一个例子是一个Variant类的故事.曾几何时,一家软件公司编写了一个Excel插件.这是一个文件,被Microsoft Excel打开之后向它添加了一些新功能,可以在Excel单元格中被调用.由于Excel单元格可以包含不同类型的数据,包括整数(例如1).浮点数(例如3.1415926535).日期(例如1/1/2000)甚至是字符串(

《黑客秘笈——渗透测试实用指南》—第1章1.1节搭建渗透测试主机

第1章 赛前准备--安装 黑客秘笈--渗透测试实用指南 本章将直接探讨攻击系统的配置方法.安全测试最为重要的方面就是有一个可重复的流程.所以,您需要有一套标准化的基准系统.测试工具和测试流程.本章将会讲解配置测试平台的方法,以及本书示例所需的额外工具的安装步骤.只要按照本章的步骤配置测试平台,您就能够重现后续章节中我所提供的案例.演示.好!让我们全力以赴.积极备战吧. 1.1 搭建渗透测试主机 黑客秘笈--渗透测试实用指南 在进行渗透测试的时候,我都会配置两套不同的测试主机.其中一台是Windo

《黑客秘笈——渗透测试实用指南(第2版)》—第1章1.5节构建渗透测试环境

1.5 构建渗透测试环境 在本书第1版中,收到很多关于为什么要让读者搭建和安装工具而不是创建脚本自动化完成这些工作的评论.主要原因是想让读者亲自经历这些步骤,这些工具都非常重要,搭建和安装的过程将有助于您知道武器库里都有什么工具.以Kali Linux为例,它包括大量工具,而且进行了很好的组织和归类,但是如果不知道这个工具已经安装了或者没使用它进行过单独的攻击,那么在紧急的情况下很难正确使用这个工具. 1.5.1 安装一个渗透测试环境 如果您根据本书第1版建立了测试环境,就可以跳过本节.众所周知

《黑客秘笈——渗透测试实用指南》—第2章2.2节Discover Scripts

2.2 Discover Scripts 黑客秘笈--渗透测试实用指南 为了简化操作,人们开发出了这种集多项功能于一身的信息挖掘框架.这个框架可以以被动式的收集方法,快速.有效地查找某公司(或者网络)的相关信息.这个框架的名字是Discover Scripts(之前叫做Backtrack Scripts)(https://github. com/leebaird/discover),它是Lee Baird开发的一款工具,能够进行自动化的多引擎搜索.例如,如果要搜索某个人的网上信息(如Linked

《黑客秘笈——渗透测试实用指南》—第2章2.3节 外部或内部的主动式信息收集

2.3 外部或内部的主动式信息收集 黑客秘笈--渗透测试实用指南 主动式信息收集就是通过主动扫描确认目标安装的操作系统和网络服务,并发现潜在漏洞的过程.即主动式信息收集必定对指定的网络段进行扫描.无论是在网络的内部还是外部进行扫描,主动式信息收集都要采用得当的扫描工具. 本书不会详细介绍扫描器的运行方法,毕竟大多数读者已经非常熟悉扫描工具了.如果您尚未掌握扫描工具的使用方法,我推荐您用社区版的Nexpose,或者用试用版的Nessus进行练习.在家里或者实验室里进行网络扫描,了解这些工具获取可发

《.NET程序员面试秘笈》----第1章 .NET概念题 面试题1 简述面向对象的程序设计思想

第1章 .NET概念题 .NET程序员面试秘笈 本章内容包含面向对象程序设计和.NET的基础概念题,由于这部分题目涉及的范围比较广,因此在很多公司的面试题中占了比较大的比重.很多.NET程序员在编写代码时非常熟练,但往往缺乏对基础知识的深刻理解,从而导致面试失败.这类知识是程序设计的基础,如果不加以重视,程序编写就没有创造性,只能学一步,做一步. 面向对象编程是当前流行的编程方式,被大多数高级语言支持..NET程序同样是基于面向对象的设计,只有深刻理解面向对象的编程理念,才可以开发出结构良好的.