我是Ada / SPARK的新手。我试图从这里开始学习一些教程 -
http://docs.adacore.com/spark2014-docs/html/ug/gnatprove.html
假设我正在运行此处给出的ISQRT示例(http://docs.adacore.com/spark2014-docs/html/ug/gnatprove.html#id19)。所有代码(*.ads
和*.adb
)都捆绑为一个名为isqrt.gpr
的项目,我正在运行的命令是 -
:~$ gnatprove -gnato13 -P isqrt.gpr
我得到的输出是 -
Phase 1 of 3: frame condition computation ...
Phase 2 of 3: analysis and translation to intermediate language ...
Phase 3 of 3: generation and proof of VCs ...
analyzing isqrtsubtyped, 0 checks
analyzing isqrtsubtyped.ISQRT, 13 checks
isqrtsubtyped.ads:7:31: warning: overflow check might fail
gprbuild: *** compilation phase failed
gnatprove: error during generation and proof of VCs, aborting.
教程说我需要向证明者提供一个名为-gnato13
的开关,这样它就会跳过一些溢出检查。但显然这个开关是不可接受的。
任何想法?
答案 0 :(得分:3)
gnatprove
命令给出的'help'非常有用:
$ gnatprove --help
Usage: gnatprove -Pproj [files] [switches] [-cargs switches]
proj is a GNAT project file
files is one or more file names
-cargs switches are passed to gcc
...
并且所提及的gnatprove
个切换均未-gnato13
。
所以正在发生的事情是你需要将交换机传递给gnatprove
正在使用的编译器。
有两种方法(至少):首先,使用-cargs
路线,
gnatprove -P t1q4.gpr -cargs -gnato13
或者第二,在GPR(我使用t1q4.gpr
),
project T1Q4 is
for Source_Files use ("t1q4.ads", "t1q4.adb");
for Object_Dir use ".build";
package Compiler is
for Default_Switches ("ada") use ("-gnato13");
end Compiler;
end T1Q4;
(for Object_Dir use ".build”;
将中间文件隐藏在一个通常不可见的子目录中; gprbuild
和gnatmake
知道用-p
标志创建所需的目录,但是{{1没有被告知就这样做了)