Frama-c指针不兼容类型
当我试图用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
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*)
这是胡说八道
- 首先,代码中没有强制转换。铸造和转化是不同的事情。你会希望那些写静态分析仪等高级东西的人会知道其中的区别
- 这里没有
。malloc返回sint8*
,这是一个唯一的类型void*
- Void指针保证在没有显式强制转换的情况下转换为任何其他指针类型
- 您需要包括stdlib.h。该工具应该告诉您,函数没有用原型声明,以防您忘记它。看来你收到的第一句话就是这样的警告
int*Stack_Init()
中的空括号列表。这是一种糟糕的做法,因为在没有原型的情况下,它可能会导致各种类型相关的错误。一个好的工具会告诉您将函数声明为int*Stack\u Init(void)
我会在静态分析器中将所有这些报告为bug
后置条件是指针有效 然后,您需要检查malloc的结果,并在malloc失败时包含某种错误处理。您没有错误 警告:使用不兼容的指针类型强制转换(源:sint8*)(目标:sint32*) 这是胡说八道
- 首先,代码中没有强制转换。铸造和转化是不同的事情。你会希望那些写静态分析仪等高级东西的人会知道其中的区别
- 这里没有
。malloc返回sint8*
,这是一个唯一的类型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*
之外还有另一个问题,即支持动态分配内存(predicatefresh
及其在ACSL中的同级),据我所知,目前还没有任何计划。您是否包括在内?谢谢您的回复,不幸的是,是的,我包括库(略高于我发送的代码部分,您包括吗?感谢您的回复,不幸的是,是的,我包括库(略高于我发送的代码部分),实际上我们不应该强制转换malloc
。是的,因为它是void
指针,强制转换不是必需的(在C语言中,不了解C++)。你到底为什么不想从malloc中获取回报。如果你不这样做,编译器会为你做的。这是最常见的问题。感谢你的回复,从确保frama-C是开发中的工具开始,b