用Frama-c切片C代码

时间:2017-11-09 18:09:51

标签: clang frama-c program-slicing

我想切片下面用frama-c显示的未使用的变量。但是我不知道应该使用哪个命令行来编写一个命令行

来切片所有未使用的变量
countries <- c("CYM", "BMU")
mypath <- "C:/Desktop/" # please change this 
for(i in countries){
download.file(paste0("http://biogeo.ucdavis.edu/data/gadm2.8/rds/",i,"_adm0.rds"),
          destfile=paste0(mypath,i,"_adm0.rds"))
}

1 个答案:

答案 0 :(得分:1)

https://frama-c.com/slicing.html所述,切片始终是相对的一些标准,目标是生成一个比原始程序更小的程序,同时表现出与标准相同的行为。 Slicing插件本身提供了几种构建此类条件的方法,但似乎您对Sparecode插件(https://frama-c.com/sparecode.html)的结果感兴趣:这是切片的专用版本,其中标准是程序在分析的入口点结束时说明(即在您的案例中为main)。换句话说,Sparecode将删除对分析中的代码的最终结果没有贡献的所有内容。在您的情况下,frama-c -sparecode-analysis hw.c给出以下结果(请注意,对printf的调用已被Variadic插件修改,并且其参数不被认为对main的最终状态有用。如果这是一个问题,您需要提供更专业的输出函数,ACSL规范表明它们对某些全局变量有影响)

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

最后,请注意,在一般情况下,Slicing(因此Sparecode)会给出过多的过时性:它只会删除对它们确定它们对标准没有影响的语句。