隐含功能合同不适用于证明

时间:2018-01-23 20:50:31

标签: ada gnat spark-ada

我在SPARK软件包中有一个程序,可以从无SPARK软件包中调用一些函数。

procedure do_monitoring is
   U_C1 : constant Float := Sim.Get_U_C1;
   I_L1 : constant Float := Sim.Get_I_L1;
   U_C2 : constant Float := Sim.Get_U_C2;
   I_L2 : constant Float := Sim.Get_I_L2;
begin
   pragma Assert (U_C1 in Float_Signed1000);
   pragma Assert (I_L1 in Float_Signed1000);
   pragma Assert (U_C2 in Float_Signed1000);
   pragma Assert (I_L2 in Float_Signed1000);
   --  Monitor PFC intermediate voltage
   monitor_signal (monitor_pfc_voltage, U_C1);
   --  Monitor PFC inductor current
   monitor_signal (monitor_pfc_current, I_L1);
   --  Monitor output voltage
   monitor_signal (monitor_output_voltage, U_C2);
   --  Monitor output inductor current
   monitor_signal (monitor_output_current, I_L2);
end do_monitoring;

GNAT为我提供info: implicit function contract not available for proof (<function_name> may not return)所有四个声明行,我从全局受保护类型调用函数。

受保护的类型函数在非SPARK包中定义如下,并使用在protected types private部分中声明的记录Sim_Out。所有记录值都使用0.0初始化。

function Get_I_L1 return Float is
begin
   return Sim_Out.I_L1;
end Get_I_L1;

function Get_U_C1 return Float is
begin
   return Sim_Out.U_C1;
end Get_U_C1;

function Get_I_L2 return Float is
begin
   return Sim_Out.I_L2;
end Get_I_L2;

function Get_U_C2 return Float is
begin
   return Sim_Out.U_C2;
end Get_U_C2;

有什么方法可以解决这个问题?我之前已经添加了一些pragma来为证明者提供其他信息subtype Float_Signed1000 is Float range -1_000.0 .. 1_000.0,但这并不像我预期的那样有效。

我想在此提出您对此主题的建议。

1 个答案:

答案 0 :(得分:2)

如果我允许编辑Sim包,我可以说例如

package Sim
with SPARK_Mode
is
   function Get return Float
   with Annotate => (Gnatprove, Terminating);
end Sim;

(那是使用AdaCore的spark2017版本),并跟进非SPARK主体

package body Sim is
   function Get return Float is (42.0);
end Sim;

报告显示Sim.Get已被跳过。

SPARK2014的后续版本将如何对此作出反应我不知道,因为User Guide的含义是Annotate为证明者设定了目标,但我们已经不允许它查看Sim的正文以进行检查。

参考手册中可能还有更多内容 - 访问adacore.com,选择资源/文档/ SPARK。