Frama-c指针不兼容类型

Frama-c指针不兼容类型,c,frama-c,C,Frama C,当我试图用Frama-c运行我的简单代码时,我遇到了一个小问题。 我试图创建一个指向数组结构的有效指针,并从函数Stack\u init返回该指针。我不明白为什么Frama-c返回这个错误,并且没有证明我的函数: [kernel]使用“gcc-C-E-I./home/federico/Desktop/simple\u main\u v2.C”进行预处理 [kernel]警告:函数malloc既没有代码也没有规范,从原型生成默认赋值 [wp]收集公理用法 [wp]警告:RTE防护装置缺失 桌面/s

当我试图用Frama-c运行我的简单代码时,我遇到了一个小问题。 我试图创建一个指向数组结构的有效指针,并从函数
Stack\u init
返回该指针。我不明白为什么Frama-c返回这个错误,并且没有证明我的函数:

[kernel]使用“gcc-C-E-I./home/federico/Desktop/simple\u main\u v2.C”进行预处理
[kernel]警告:函数malloc既没有代码也没有规范,从原型生成默认赋值
[wp]收集公理用法
[wp]警告:RTE防护装置缺失
桌面/simple\u main\u v2.c:28:[wp]警告:使用不兼容的指针类型强制转换(源代码:sint8*)(目标代码:sint32*))
[wp]已计划0个目标
我的意图是创建一个返回指针的函数,无需先决条件,其中后决条件是指针有效

有人能帮我理解我的错误在哪里吗

/*
  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;               
}

这个代码基本上是正确的。您可能应该在malloc的返回中添加一个cast(在C++中是必需的),但根据我对C的记忆,这是可选的:

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

别忘了标题
stdlib.h

这段代码基本上是正确的。您可能应该在malloc的返回中添加一个cast(在C++中是必需的),但根据我对C的记忆,这是可选的:

  int * stack = (int*) malloc(sizeof(int[100]);
不要忘记标题
stdlib.h

您没有错误

警告:使用不兼容的指针类型强制转换(源:sint8*)(目标:sint32*)

这是胡说八道

  • 首先,代码中没有强制转换。铸造和转化是不同的事情。你会希望那些写静态分析仪等高级东西的人会知道其中的区别
  • 这里没有
    sint8*
    。malloc返回
    void*
    ,这是一个唯一的类型
  • Void指针保证在没有显式强制转换的情况下转换为任何其他指针类型
  • 您需要包括stdlib.h。该工具应该告诉您,函数没有用原型声明,以防您忘记它。看来你收到的第一句话就是这样的警告
这段代码唯一奇怪的地方是,分析器没有抱怨
int*Stack_Init()
中的空括号列表。这是一种糟糕的做法,因为在没有原型的情况下,它可能会导致各种类型相关的错误。一个好的工具会告诉您将函数声明为
int*Stack\u Init(void)

我会在静态分析器中将所有这些报告为bug


后置条件是指针有效

然后,您需要检查malloc的结果,并在malloc失败时包含某种错误处理。

您没有错误

警告:使用不兼容的指针类型强制转换(源:sint8*)(目标:sint32*)

这是胡说八道

  • 首先,代码中没有强制转换。铸造和转化是不同的事情。你会希望那些写静态分析仪等高级东西的人会知道其中的区别
  • 这里没有
    sint8*
    。malloc返回
    void*
    ,这是一个唯一的类型
  • Void指针保证在没有显式强制转换的情况下转换为任何其他指针类型
  • 您需要包括stdlib.h。该工具应该告诉您,函数没有用原型声明,以防您忘记它。看来你收到的第一句话就是这样的警告
这段代码唯一奇怪的地方是,分析器没有抱怨
int*Stack_Init()
中的空括号列表。这是一种糟糕的做法,因为在没有原型的情况下,它可能会导致各种类型相关的错误。一个好的工具会告诉您将函数声明为
int*Stack\u Init(void)

我会在静态分析器中将所有这些报告为bug


后置条件是指针有效


然后,您需要检查malloc的结果,并在malloc失败时包含某种错误处理。

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


但是请注意,
malloc
除了支持
void*
之外还有另一个问题,即支持动态分配内存(谓词
fresh
及其在ACSL中的同级),据我所知,目前还没有任何计划。

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


但是请注意,
malloc
除了支持
void*
之外还有另一个问题,即支持动态分配内存(predicate
fresh
及其在ACSL中的同级),据我所知,目前还没有任何计划。

您是否包括在内?谢谢您的回复,不幸的是,是的,我包括库(略高于我发送的代码部分,您包括吗?感谢您的回复,不幸的是,是的,我包括库(略高于我发送的代码部分),实际上我们不应该强制转换
malloc
。是的,因为它是
void
指针,强制转换不是必需的(在C语言中,不了解C++)。你到底为什么不想从malloc中获取回报。如果你不这样做,编译器会为你做的。这是最常见的问题。感谢你的回复,从确保frama-C是开发中的工具开始,b