当我尝试在Frama-c中运行我的简单代码时,我遇到了一些问题。
我正在尝试创建一个指向数组结构的有效指针,并从我的函数Stack_init
返回该指针。我不明白为什么Frama-c会返回此错误并且不能证明我的功能:
[kernel] preprocessing with "gcc -C -E -I. /home/federico/Desktop/simple_main_v2.c"
[kernel] warning: Neither code nor specification for function malloc, generating default assigns from the prototype
[wp] Collecting axiomatic usage
[wp] warning: Missing RTE guards
Desktop/simple_main_v2.c:28:[wp] warning: Cast with incompatible pointers types (source: sint8*) (target: sint32*)
[wp] 0 goal scheduled
我的目的是创建一个返回指针的函数,不带前置条件,后置条件是指针有效。
有人可以帮我理解我的错误在哪里吗?
/*
create_stack
Inputs: none
Outputs: S (a stack)
Preconditions: none
Postconditions: S is defined and empty
*/
/*@
ensures \valid(\result) && \result[0] == 0;
*/
int *Stack_Init()
{
int *stack = malloc (sizeof(int[100]));
stack[0] = 0;
return stack;
}
答案 0 :(得分:6)
WP插件不支持void *
指针,因为它的内部内存模型依赖于声明元素的静态类型。这是您正在目睹的大部分错误。正如您在issue 2078中所看到的,精确的记忆模型将在某些时候出现(Frama-C Magnesium版本)并提供一些帮助。
但请注意malloc
还有另一个问题,即支持void *
,即支持动态分配的内存(谓词fresh
及其在ACSL中的兄弟姐妹),其中没有什么是真的据我所知,此刻计划在那一刻。
答案 1 :(得分:2)
你没有错误。
警告:使用不兼容的指针类型进行转换(来源:sint8 *)(target:sint32 *)
这是胡说八道。
sint8*
。 malloc返回void*
这是一种独特的类型。此代码唯一奇怪的是分析器不会在int * Stack_Init()
中抱怨空括号列表。这是不好的做法,因为如果没有原型,它可能会导致各种类型相关的错误。一个好的工具会告诉你将函数声明为int * Stack_Init (void)
。
我会将所有这些报告为静态分析器中的错误。
后置条件是指针有效。
然后你需要检查malloc的结果,并在malloc失败的情况下包含一些错误处理。
答案 2 :(得分:-1)
这段代码基本上是正确的。您可能应该向malloc的返回添加一个强制转换(在C ++中是强制的),但是从我记忆中的C来看,这是可选的:
int * stack = (int*) malloc(sizeof(int[100]);
并且不要忘记标题stdlib.h