健壮性和上下文代码验证

第一部分:健壮性验证

作者:Anirban Gangopadhyay和Ram Cherukuri

这是第一部分一个由两部分组成概述代码验证方法的系列。

我们从一个问题开始:在软件开发的哪个阶段我应该验证我的代码?

答案很简单。您应该在编译完代码之后立即验证它,此时代码就会浮现在您的脑海中。一旦您看到潜在的错误,检查和修复这些错误几乎是微不足道的。在工作流的这个阶段之后,修正错误永远不会变得容易。

如果您采用这种方法,您很可能验证一个代码单元。在开发周期的后期,这个单元可能会集成到现有的代码库中。Polyspace®下载188bet金宝搏产品允许您以两种截然不同的方式来进行验证:通过健壮性验证(在健壮性验证中您将单独验证您的单元),或者通过上下文验证(在上下文验证中您将在其余代码基的上下文中验证您的单元)。在以下两篇文章中,我们将提供一些指导方针,帮助您决定采用哪种方法。

但首先,每种方法有什么不同?让我们从健壮性验证开始。

在健壮性验证中,Polyspace产品验证您的单元是健壮的(即,它对所有输入下载188bet金宝搏、未定义函数、函数调用序列的某些错误是安全的)。如果您采用这种方法,那么在代码集成和测试期间就不会出现新的错误。如果您检查并修复了Polyspace产品标记的所有错误,则不必再次检查该单元(文件或功能)。下载188bet金宝搏

让我们用几个简单的例子来说明这种行为。

抗所有输入的鲁棒性

示例显示num1和num2是dividebydifference函数的输入。

在本例中,num1和num2是函数的输入dividebydifference.除了他们的数据类型,Polyspace不能确定其他任何关于num1num2从这个代码。因此,它考虑了an范围内的所有可能值int变量:

  • 操作的结果num1——num2num /窝可以超过一个int变量。因此,Polyspace会对潜在的溢出发出警告在两个操作。
  • num1可以等于num2.因此,Polyspace警告可能被零除的情况除法错误。

然而,一旦Polyspace产品在您的代码中指出下载188bet金宝搏了这些漏洞,您就可以通过采取适当的操作使函数更加健壮。例如,在上面的示例中,您可以进行检查,以防止溢出和除零。

对所有未定义函数的鲁棒性

假设您的代码单元调用了单元外部的函数,并且/或者您没有函数定义。如何确保在定义函数之后,代码中不会出现新的运行时错误?您可以使用健壮性方法。

示例显示den在声明期间被赋值在1到3之间。

在上面的例子中,在声明期间被赋值在1到3之间。然而,它的地址被传递给checkDenominator可能会发生变化checkDenominator.自从定义checkDenominator是不提供,Polyspace产品考虑的可能性下载188bet金宝搏可以更改,并且可以在anint变量。因此,它警告说,除法可能导致零错误除法。

然而,一旦Polyspace产品指出这个错误,您下载188bet金宝搏可以保护分区,例如,通过传递checkDenominator通过值而不是通过指针。除法运算是安全的,不管它的定义是什么checkDenominator可能是。

通过通过值而不是通过指针将den传递给check分母来保护除法。

从用户的角度来看,健壮性验证也很吸引人。使用这种方法设置验证需要更少的工作。在提供了源文件和目标设置之后,可以继续运行验证。默认设置用于根据所有输入、函数定义等验证代码。

因此,健壮性验证是可行之道,不是吗?在实践中,你必须权衡花在设置上的时间和花在检查大量错误上的时间。然而,使用鲁棒性方法可能会导致太多的潜在错误而无法检查。

为了在稳健性验证过程中发现所有的错误,Polyspace产品对输入变量等未知数进行了广泛的假设。下载188bet金宝搏大多数涉及这些未知因素的操作都可能失败。因此,您需要检查的潜在错误可能比时间所允许的多得多。

下一篇文章说明了一种可选的验证方法(称为上下文代码验证),它解决了这个问题。