Clang 用Frama-C切片C代码
我想对frama-c中显示的未使用的变量进行切片。但是我不知道我应该写哪个命令行,用一个命令行分割所有未使用的变量Clang 用Frama-C切片C代码,clang,frama-c,program-slicing,Clang,Frama C,Program Slicing,我想对frama-c中显示的未使用的变量进行切片。但是我不知道我应该写哪个命令行,用一个命令行分割所有未使用的变量 Last login: Thu Nov 9 20:48:42 on ttys000 Recep-MacBook-Pro:~ recepinanir$ cd desktop Recep-MacBook-Pro:desktop recepinanir$ cat hw.c #include <stdio.h> int main() { int x= 10;
Last login: Thu Nov 9 20:48:42 on ttys000
Recep-MacBook-Pro:~ recepinanir$ cd desktop
Recep-MacBook-Pro:desktop recepinanir$ cat hw.c
#include <stdio.h>
int main()
{
int x= 10;
int y= 24;
int z;
printf("Hello World\n");
return 0;
}
Recep-MacBook-Pro:desktop recepinanir$ clang hw.c
Recep-MacBook-Pro:desktop recepinanir$ ./a.out
Hello World
Recep-MacBook-Pro:desktop recepinanir$ clang -Wall hw.c -o result
hw.c:5:9: warning: unused variable 'x' [-Wunused-variable]
int x= 10;
^
hw.c:6:9: warning: unused variable 'y' [-Wunused-variable]
int y= 24;
^
hw.c:7:9: warning: unused variable 'z' [-Wunused-variable]
int z;
^
3 warnings generated.
Recep-MacBook-Pro:desktop recepinanir$
上次登录:ttys000上的11月9日星期四20:48:42
Recep MacBook Pro:~recepinanir$cd桌面
Recep MacBook Pro:桌面recepinanir$cat硬件
#包括
int main()
{
int x=10;
int y=24;
intz;
printf(“Hello World\n”);
返回0;
}
Recep MacBook Pro:桌面recepinanir$clang hw.c
Recep MacBook Pro:桌面recepinanir$/a.out
你好,世界
Recep MacBook Pro:桌面recepinanir$clang-Wall硬件c-o结果
hw.c:5:9:警告:未使用的变量“x”[-Wunused variable]
int x=10;
^
hw.c:6:9:警告:未使用的变量“y”[-Wunused variable]
int y=24;
^
hw.c:7:9:警告:未使用的变量“z”[-Wunused variable]
intz;
^
生成3个警告。
Recep MacBook Pro:桌面recepinanir$
如上所述,切片始终与某些标准相关,其目标是生成一个比原始程序更小的程序,同时呈现与该标准相同的行为。切片插件本身提供了几种构建此类标准的方法,但您似乎对Sparecode插件()的结果感兴趣:这是切片的一个专门版本,其中标准是分析入口点末尾的程序状态(即您的案例中的main
)。换句话说,Sparecode将删除所有对分析代码的最终结果没有帮助的内容。在您的案例中,frama-c-sparecode analysis hw.c
给出了以下结果(请注意,对printf
的调用已被Variadic插件修改,它的参数对于main的最终状态没有用处。如果这是一个问题,您需要提供更专门的输出函数,ACSL规范表明它们对某些全局变量有影响)
最后,请注意,在一般情况下,切片(因此Sparecode)会给出一个过度近似:它只会删除确定它们对标准没有影响的语句
/* Generated by Frama-C */
#include "stdio.h"
/*@ assigns \result, __fc_stdout->__fc_FILE_data;
assigns \result
\from (indirect: __fc_stdout->__fc_FILE_id),
__fc_stdout->__fc_FILE_data;
assigns __fc_stdout->__fc_FILE_data
\from (indirect: __fc_stdout->__fc_FILE_id),
__fc_stdout->__fc_FILE_data;
*/
int printf_va_1(void);
int main(void)
{
int __retres;
printf_va_1();
__retres = 0;
return __retres;
}