dafny - 错误:无法编译假设语句
问题描述
我正在尝试一次从文件中读取一定数量的字节(如果我一次读取整个文件,则效果很好)。我ReadLemma
在下面的代码中添加了引理 ( 以帮助摆脱 while 循环中的修饰符子句错误,但现在我得到了Error: an assume statement cannot be compiled
. 关于如何解决此问题的任何想法?
include "Io.dfy"
lemma ReadLemma(fs: FileStream, file_offset: nat32, buffer: array?<byte>, num_bytes: int32)
requires fs.IsOpen();
requires fs.env.Valid();
requires fs.env.ok.ok();
requires fs.Name() in fs.env.files.state();
ensures fresh(buffer);
{
assume false;
}
method {:main} Main(ghost env: HostEnvironment?)
requires env != null && env.Valid() && env.ok.ok()
modifies env.ok
modifies env.files
{
var argc := HostConstants.NumCommandLineArgs(env);
if argc != 3 {
print "[USAGE]: mono cp.exe SrcFilename DstFilename!\n";
return;
}
var src := HostConstants.GetCommandLineArg(1, env);
var dst := HostConstants.GetCommandLineArg(2, env);
var srcResult := FileStream.FileExists(src, env);
var dstResult := FileStream.FileExists(dst, env);
if !srcResult {
print "Source File Does Not Exist!\n";
return;
}
if dstResult {
print "Destiny File Already Exist!\n";
return;
}
var srcSuccess, srcFs := FileStream.Open(src, env);
if !srcSuccess {
print "Failed to open src file!\n";
return;
}
var dstSuccess, dstFs := FileStream.Open(dst, env);
if !dstSuccess {
print "Failed to open dst file!\n";
return;
}
var success, len: int32 := FileStream.FileLength(src, env);
if !success {
print "Couldn't get stream size!\n";
return;
}
var BYTES_TO_READ := 256;
var file_offset, buffer, start, srcOk, dstOk := 0, new byte[BYTES_TO_READ], 0, true, true;
while file_offset as int + BYTES_TO_READ as int < len as int
decreases len as int - (file_offset as int + BYTES_TO_READ as int);
invariant srcFs.IsOpen() && srcFs.env.Valid() && srcFs.env.ok.ok()
invariant srcFs.Name() in srcFs.env.files.state()
{
ReadLemma(srcFs, file_offset as nat32, buffer, BYTES_TO_READ);
srcOk := srcFs.Read(file_offset as nat32, buffer, start, BYTES_TO_READ);
dstOk := dstFs.Write(file_offset as nat32, buffer, start, BYTES_TO_READ);
file_offset := file_offset + BYTES_TO_READ;
}
}
Read 函数是从文件中读取的函数。正如我所说,如果我阅读文件的全部内容,它工作正常。没有引理,我得到这个错误call may violate context's modifies clause
。
解决方案
推荐阅读
- flutter - Flutter 中的 htmlspecialchars_decode(stripslashes())
- r - 列只能是数字或字母数字值 R
- python - holoviews hv.save x 标签截止(修剪)
- git - 从 git 历史记录中的提交中删除 cognito 凭据,用密码重写 master 中的提交以删除
- django - DJango 读取静态文件 Json
- python - 为什么我只向该文件写入 28,672 位?
- mysql - 在 CentOS 7.7 上初始化 MariaDB 10.4.12
- tensorflow - AttributeError:模块“tensorflow”没有属性“get_default_graph”
- mongodb - MongoDB $gte 无法匹配嵌套文档的字段
- sql - 在存储过程中正确设置 CONCAT_NULL_YIELDS_NULL 和 ANSI_WARNINGS ON