假冒注册商标罪:捕捉未经测试的返回值

admin 5个月前 (04-12) 科技 50 0

前面翻译的一篇文章《使用错误代码工具举行C++错误处置》中提到,作者的灵感来源于另一篇文件《捕捉未经测试的返回值》,于是再把这篇文章翻译过来,做为对比,也算是形成一个系列的文章。

前言

函数返回值通常用于表函数是否在没有错误的情形下执行。然则,很难确保挪用者适当地使用这些信息(指返回值)。也许一些商业工具可以完成这项事情,但你并不总是能获得购置允许,特别是在小型项目中。你很有可能听到过这样说:“我信赖你,你不会犯这样的错误。”

我在这里提出的想法,是受到几周前我们在项目中泛起的一个错误的启发。它只泛起在一个生产环境中,花了几天的时间才发现,它来自于一个特定环境的初始化例程的失败。实际上,挪用此例程的代码没有测试其返回代码。

添加责任标志

在我的履历中(但不是很长时间),我经常看到函数返会是按类型分组成一个枚举。如图1所示,挪用者可以或多或少忽略此类返回值。为了控制返回值发生了什么,我不直接返回这些值,而是返回类ErrorCode的实例。它包罗两个成员变量:值(enValue_)指示函数错误代码,责任标志(PboResp_):

class ErrorCode
{
private:
   ErrorCodeValue enValue_;
   bool * PboResp_;
public:
   // some code
}

责任标志的目的是解释是否需要对ErrorCode工具的值卖力(指是否需要检查)。当ErrorCode工具使用拷贝组织函数或赋值函数拷贝工具时,值(enValue_)被拷贝,同时责任标志PboResp_中包罗的责任需要“转移”。所谓“转移”,是指拷贝操作将责任从源实例转移到目的实例。复制后,源实例不再卖力其内容(即挪用者不再需要检查)。(实际上,拷贝组织函数的语义与赋值函数略有差别,但总体思绪是相同的。下文详解。)

由于拷贝组织函数和赋值函数的参数使用const修饰符,我选择将责任标志PboResp_实现为一个指向布尔值的指针,而不是一个布尔值。这使拷贝函数能够修改作为参数通报进来的源实例的责任标志PboResp_。另有另一个适用于运算符=约束:若是参数ErrorCode工具的责任标志PboResp_是true,使之前值enValue_会丢失,必须要纪录(指输出日志)。(此处形貌的责任转移历程类似于发生在auto_ptr上的复制)

ErrorCode工具还要使用==和!=运算符。与从函数返回的暂且ErrorCode工具对照时,需要这些操作符。这些暂且ErrorCode工具已被组织成示意特定的错误状态(例如乐成)。如您所料,这些操作符函数就是对照两个ErrorCode工具内部的值enValue_。而且,这些ErrorCode工具的责任标志PboResp_也要设置为false,这样就不会泛起“未经测试的错误代码”的日志纪录。若有需要,其他测试操作符(<, >)也可以实现。

最后,析构函数要检查实例是否仍然对错误代码值卖力(责任标志PboResp_为true),若是存在这种情形就要纪录它。

与现有代码的集成

在我看来,这项手艺的乐成取决于它能否很容易地集成到现有的程序中。图1展示了一种情形,这是一个很好的起点,可以演示若何举行集成。

首先,在类界说时,我使用之前界说的枚举的名称作为类名(即旧的枚举名是ErrorCode,则新的类名就是ErrorCode)。因此,所有之前返回枚举值的函数,现在都酿成返回一个错误码工具,只要重新编译程序即可。我还将现在有枚举名ErrorCode改为ErrorCodeValue。要使这项手艺真正有用,还必须界说一个ErrorCodeValue作为参数的组织函数。此组织函数主要在两种情形下会被隐式挪用:第一,之前函数是返回ErrorCodeValue,而不是ErrorCode类的工具。第二,当ErrorCode工具和ErrorCodeValue举行对照(通过运算符==或!=)。在这种情形下,会用ErrorCodeValue组织出一个暂且的ErrorCode工具,用作对照运算符的参数。如前所述,对照运算符还“关闭”两个工具的责任标志(责任标志PboResp_置为true)。

实行

2显示错误处置的新实现,纵然用ErrorCode类。ErrorCode类添加到现有文件ErrorCodes.h中。此外,还需要建立一个文件ErrorCodes.cpp,用于实现ErrorCode类的成员函数。

如上所述,拷贝组织函数和赋值操作符必须将错误代码的责任转移到它们的目的工具。但这还不够,函数必须始终ErrorCode工具,该工具卖力其内容。因此,拷贝组织函数和接受ErrorCodeValue的组织函数,在构建工具时将责任标志PboResp_设置为true(他们无条件地这样做)。这就是rf组织函数与赋值操作符的差别之处:赋值操作符把责任标志从源工具复制到目的实例的,拷贝组织函数则要设置责任标志为true。

最后,默认组织函数与所有其他组织函数差别,由于它将责任标志初始化为false。默认组织的ErrorCode工具不示意未经测试的错误代码,它完全取决于建立它的程序员来决议若何处置它。

增强版的ErrorCode类,可以在析构函数和赋值操作符函数中增添断言,以便在开发和测试阶段阻挡“错误泄露”(即知道有哪些错误码没有检查)。

把新的错误码类在图1程序中实行,运行后将在尺度错误输出上输出以下新闻

Destruction of untested error code: 
value 1
Untested error code (value 0) erased by 
new value 2

结语

我信赖这个编码技巧对于检测某种类型的错误是非常有辅助的。请注意,此方式没有消除任何错误,只是在问题发生后讲述未经测试的返回代码。我信赖纵然在现有的项目中也很容易实现。开始时,你可能会获得一个日志文件,其中包罗大量未经测试的返回代码。因此,在我们的项目中,我们不得不稍微清算一下代码。

迎接关注我的民众号【林哥哥的编程札记】,也迎接赞赏,谢谢!

,

诚信在线

诚信在线(www.AIdshuhehaote.com)现已开放诚信在线手机版下载。游戏公平、公开、公正,用实力赢取信誉。

AllBetGaming声明:该文看法仅代表作者自己,与本平台无关。转载请注明:假冒注册商标罪:捕捉未经测试的返回值

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:658
  • 页面总数:0
  • 分类总数:8
  • 标签总数:1144
  • 评论总数:222
  • 浏览总数:10179