Frama-c指针不兼容的类型

时间:2015-09-04 10:27:33

标签: c frama-c

当我尝试在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;               
}

3 个答案:

答案 0 :(得分:6)

WP插件不支持void *指针,因为它的内部内存模型依赖于声明元素的静态类型。这是您正在目睹的大部分错误。正如您在issue 2078中所看到的,精确的记忆模型将在某些时候出现(Frama-C Magnesium版本)并提供一些帮助。

但请注意malloc还有另一个问题,即支持void *,即支持动态分配的内存(谓词fresh及其在ACSL中的兄弟姐妹),其中没有什么是真的据我所知,此刻计划在那一刻。

答案 1 :(得分:2)

你没有错误。

  

警告:使用不兼容的指针类型进行转换(来源:sint8 *)(target:sint32 *)

这是胡说八道。

  • 首先,代码中没有强制转换。 投放转换是不同的事情。你希望那些写静态分析器等高级东西的人会知道它们之间的区别......
  • 这里没有sint8*。 malloc返回void*这是一种独特的类型。
  • Void指针保证在没有显式转换的情况下转换为/从任何其他指针类型转换。
  • 您需要包含stdlib.h。该工具应告诉您,如果您忘记了该函数,则不会使用原型声明该函数。你得到的第一行似乎就是这样一个警告。

此代码唯一奇怪的是分析器不会在int * Stack_Init()中抱怨空括号列表。这是不好的做法,因为如果没有原型,它可能会导致各种类型相关的错误。一个好的工具会告诉你将函数声明为int * Stack_Init (void)

我会将所有这些报告为静态分析器中的错误。

  

后置条件是指针有效。

然后你需要检查malloc的结果,并在malloc失败的情况下包含一些错误处理。

答案 2 :(得分:-1)

这段代码基本上是正确的。您可能应该向malloc的返回添加一个强制转换(在C ++中是强制的),但是从我记忆中的C来看,这是可选的:

  int * stack = (int*) malloc(sizeof(int[100]);

并且不要忘记标题stdlib.h