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);
到我的规范文件。
我一直在努力学习使用 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);
到我的规范文件。