Clang 用Frama-C切片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;

我想对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;
    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;
}