pre 和 post 条件是否代替函数验证?

Do pre and post conditions take the place of in function validation?

我一直在努力学习使用 SPARK 的基础知识,并且我已经开始使用预条件和 post 条件,但我不确定它们是否会取代验证?例如,除非所有门都关闭并锁定,否则飞机不会切换到起飞模式的功能。我是否需要向过程主体添加代码以停止此行为,或者 pre 和 post 条件是否足够?我不清楚,因为 none 我的课程教程实际上是这样做的,但是当我测试程序时,我不受限制违反条件。

在许多情况下,可以在子程序验证的 leu 中使用先决条件和 post 条件。另一方面,有时子程序必须反复监视事件或条件,然后正确响应事件或条件。在这些情况下,通常最好在子程序中执行该监视。

第一:如果你使用 GNAT 编译器,你必须添加标志 -gnata 到编译器标志或使用 GNAT 配置文件 pragma Assertion_Policy(Check); 来启用对 Pre- 和 [=30= 的检查]-状况。如果没有这些选项之一,所有检查都将被忽略。这就是允许您违反它们的原因。

先决条件发生在之前 所选子程序被执行。例如,函数声明为:

function Add(A, B: Positive) return Positive is (A + B) with
   Pre => A < 10;

在执行函数之前将检查此前提条件。例如:

I := Add(2, 2);
Put_Line(Positive'Image(I)); -- prints 4 as expected
begin
   I := Add(10, 2); -- Crash, exception on violation of precondition
exception
   when ASSERT_FAILURE =>
      Put_Line(Positive'Image(I)); -- prints 4
end;

Post子程序 执行后检查条件。另一个例子:

procedure Increment(A: in out Positive) with
   Post => A < 20 is
begin
   A := A + 1;
end Increment;

和用法:

I := 2;
Increment(I);
Put_Line(Positive'Image(I)); -- prints 3
I := 19;
begin
   I := Increment(I); -- Crash, exception on violation of postcondition
exception
   when ASSERT_FAILURE =>
      Put_Line(Positive'Image(I)); -- prints 19
end;

我能够违反我的条件的原因是因为我需要启用条件断言,如 thindil 所述。我通过添加

解决了它
pragma Assertion_Policy (Check);

到我的规范文件。