健壮性和上下文代码验证:
第二部分:语境验证
作者:Anirban Gangopadhyay和Ram Cherukuri
在第一部分在这两部分系列中,我们讨论了稳健性代码验证,这是一种方法,您可以在其中验证您的代码单位的代码单位。我们概述了一些例子,我们讨论了使用这种方法的利弊。
在这篇文章中,我们将讨论上下文代码验证,在该验证中,您将在代码库的上下文中验证您的代码单元,该单元将被集成到代码库中。这篇文章将使用与上一篇文章相同的例子,向您介绍上下文代码验证背后的概念,然后概述使用这两种类型的代码验证(健壮性和上下文)的最佳实践。
在上下文代码验证中,需要进行一些初始设置——您必须为正在验证的代码提供一些上下文。例如,你必须提供:
- 输入变量的合理范围。
- 手动存根表示未定义的功能。
- 主要功能调用函数的顺序,以便在其他人之前调用一些。(如果您没有提供实际情况,这是必要的
主要的
功能。)
但害怕没有。虽然它听起来像是很多工作前面,但这是你的单位的一次性设置。你有什么回报?您有更少的潜在错误来审查。让我们从稳健性代码验证帖子中采取相同的例子。这次,在验证之前,我们在PolySpace中使用可用选项®下载188bet金宝搏产品为验证提供上下文。
向输入提供上下文
假设你知道num1.
和num2.
不能等于。它们都不能超过32位整数的范围。您可以将此信息指定给验证软件。PolySpace产下载188bet金宝搏品允许您通过数据范围规范界面执行此操作,您可以在其中指定精确的输入范围。
这是验证相同的结果。这次,它已经指定了num1.
和num2.
在范围内[100年200年……
]和[10 0…
] 分别。正如预期的那样,没有出现划分和溢出错误。PolySpace用户界面中的代码显示为绿色,表示软件已证明缺少这些错误。
为未定义的函数提供上下文
假设你知道checkDenominator
正如它的名字所暗示的那样:它检查分母的值,但不改变它。Polyspace产下载188bet金宝搏品允许您通过数据范围规范接口。
这是验证相同的结果。这次,它已经指定了checkDenominator
不改变存储在地址中的值窝
。正如所预期的那样,未显示归零错误的划分。工具提示窝
在该师期间,请讲述DEN仍在范围内[1 ... 3
],就像初始化时一样。
是的,有时你必须尽力猜测输入范围。但如果您的投入代表现实世界中的数量,您或客户将对他们的范围有一个坚实的想法。一旦您为这些范围验证了代码,您可以将它们作为单位的安全范围文档。如果有人在这些范围内使用您的单位,他或她完全以他或她自己的风险为行为。
记住:有了情境验证,你(或你的上司)脑海中总会潜藏着那些“如果……会怎么样”的想法。你可能会问:
- 如果上下文更改了什么?
- 如果您不了解您的单位可能被重用的所有上下文怎么办?毕竟,我们要求您尽早验证代码。
- 如果认证要求要求您有某些单位验证所有可能性的单位怎么办?您可能必须提出一份报告,说明您的尽职调查。
在健壮性和上下文代码验证之间选择的最佳实践
在开始为验证指定上下文之前,最佳实践可能是后退一步,问以下问题:
- 您的申请有多重要?
如果您的代码是用于关键应用程序的,那么如果您能够确保单元的健壮性,您和代码的用户晚上会睡得更好。对代码执行健壮性验证可能会更好。
否则,即使你为你的单位记录了所有的安全范围,你仍然给其他人留下了不阅读或遵循你的指示的空间。健壮性验证是一种保护代码不受任何环境影响的方法。
此外,您可能迟早要满足认证要求。如果你正在对你的单元进行健壮性验证并修复或证明所有错误,那么你就领先了一步。
- 您是否知道您的单位的整套要求?
您能写下您的单位互动的每个其他单元的详细规格吗?您知道您的单位将收到的完整输入范围吗?如果没有,您将更好地验证您使用上下文代码验证的所有可能性的代码。
您还可以采用健壮性和上下文验证相结合的方法,为某些变量提供范围,而不为其他变量提供范围。
- 您的代码是否有多大可能重用?
您正在编写一个可以在许多上下文中调用的库函数吗?您是否在为将来要继承的类编写定义?如果是这样,理想情况下应该对代码执行健壮性验证。
您的代码越强大,您将来更容易重复使用它。如果在狭窄的上下文中验证代码,则严重限制其可重用性。如果有人打算在该狭隘的上下文之外重复使用您的代码,他必须重新运行代码上的验证。
一旦回答了这些问题,就可以设计适合自己需求的验证策略。最终,你的策略将是绝对安全与充分利用时间之间的折衷。Polyspace产下载188bet金宝搏品可以帮助您识别代码的弱点,并由您决定提供多少上下文。