frama-c - Frama-c - 在 strlen 之前证明“分配”的问题
问题描述
assigns
在调用其他分配到 strlen 的函数后,我遇到了证明问题。下面是一个从标准库调用函数的简单示例。功能契约基本上是strcpy
需求的副本。
#include <string.h>
/*@
requires valid_string_src: valid_read_string(src);
requires room_string: \valid(dest+(0..strlen(src)));
requires separation:
\separated(dest+(0..strlen(src)), src+(0..strlen(src)));
assigns dest[0..(strlen(src))];
*/
void mycpy(char *dest, const char *src) {
strcpy(dest, src);
}
assigns
即使与strcpy 匹配, Frama-c 也无法证明mycpy assigns
:
Goal Assigns ... (exit):
Let a_0 = « dest@L1 + 0 ».
Let x_0 = L_strlen(µ:Mchar@L1, src@L1).
Let x_1 = 1 + x_0.
Let x_2 = L_strlen(Mchar_0, src@L1).
Assume {
Have: 0 <= x_2.
Type: is_sint8_chunk(µ:Mchar@L1).
(* Heap *)
Type: (region(dest@L1.base) <= 0) /\ (region(src@L1.base) <= 0) /\
linked(µ:Malloc@L1) /\ sconst(µ:Mchar@L1).
(* Goal *)
When: !invalid(µ:Malloc@L1, a_0, 1 + x_2).
Stmt { L1: }
(* Pre-condition *)
Have: P_valid_read_string(µ:Malloc@L1, µ:Mchar@L1, src@L1) /\
valid_rw(µ:Malloc@L1, a_0, x_1) /\
separated(a_0, x_1, « src@L1 + 0 », x_1).
}
Prove: x_2 <= x_0.
--------------------------------------------------------------------------------
Prover Alt-Ergo 2.3.3: Timeout (Qed:6ms) (10s) (cached).
目标的完整上下文表明它试图证明:L_strlen(Mchar_0, src@L1) <= L_strlen(µ:Mchar@L1, src@L1)
. 但是,没有关于Mchar_0
.
这是什么µ:Mchar@L1
和Mchar_0
?我如何证明这个分配?
Frama-c 版本:22.0(钛)。
解决方案
推荐阅读
- neo4j - 所有孩子的 Neo4j 循环
- react-native-navigation - 如何使用本机反应在菜单页面中获取导航参数
- tcp - 了解 Wireshark 中捕获的 TCP 会话
- .net - 如何通过 .net 代码读取扩展事件
- windows - 任务调度程序 - 任务注册被删除
- delphi - SysUtils.LoadPackage 替换 Aplication.OnMessage 处理程序
- c# - System.Diagnostics.Process.Start 用于 SQL 中的 .pdf 文件路径
- matlab - 将 IEC 61131-3 DINT 拆分为两个 INT 变量(PLC 结构化文本)
- php - Microsoft Graph API - 为作业获取评分“maxPoints”
- spring-boot - @RefreshScope 和 @Order