我想test.c
为所有断言切片文件。
test.c
如下所示:
#include <stdlib.h>
typedef struct {
float r;
float g;
float b;
} Color;
typedef struct {
int k;
Color* colors;
} Colors;
void foo(int* a, int k, Colors *colors)
{
int b=0;
colors->colors = (Color*) malloc(k*sizeof(Color));
//@ assert (colors == NULL);
if (colors==NULL)
return;
colors->k = k;
int c=10;
*a=8;
//@ assert(*a>b);
}
我使用以下命令运行 frama-c:
frama-c -slice-assert @all -main foo test.c -then-on 'Slicing export' -print -ocode slice.c
结果slice.c
如下所示:
/* Generated by Frama-C */
typedef unsigned int size_t;
struct __anonstruct_Color_1 {
float r ;
float g ;
float b ;
};
typedef struct __anonstruct_Color_1 Color;
struct __anonstruct_Colors_2 {
int k ;
Color *colors ;
};
typedef struct __anonstruct_Colors_2 Colors;
/*@ ghost extern int __fc_heap_status __attribute__((__FRAMA_C_MODEL__)); */
/*@
axiomatic dynamic_allocation {
predicate is_allocable{L}(size_t n)
reads __fc_heap_status;
}
*/
void foo(int *a, Colors *colors)
{
int b;
/*@ assert colors ≡ (Colors *)((void *)0); */ ;
return;
}
查看 sliced function foo
,似乎处理不完整。frama-c 输出告诉我:
test.c:19:[kernel] warning: out of bounds write. assert \valid(&colors->colors);
test.c:20:[value] Assertion got status invalid (stopping propagation).
“状态无效”应该是什么意思?当我将第一个断言更改为时,为什么它在这里停止传播以及为什么它起作用//@ assert (colors != NULL);
?