use*_*336 10 c free static-analysis
我想从C源代码生成程序依赖图(PDG).我找到了解释它是怎么做的论文,但都使用了商业CodeSurfer工具.
有没有可以完成这项工作的免费工具或开源项目?
Pas*_*uoq 17
Frama-C是一个开源静态分析平台,具有基于程序依赖图计算的C程序切片器.
请注意,切割用实际编程语言(如C语言)编写的实际程序涉及许多在科学出版物中略过的特殊情况和概念.尽管如此,我相信你不会发现比Frama-C的PDG计算更简单的东西,首先是因为它是唯一可用的开源(我知道),其次是因为处理C程序的任何其他PDG计算都会有解决同样的问题并引入相同的概念.
这是一个例子:
int a, b, d, *p;
int f (int x) {
return a + x;
}
int main (int c, char **v) {
p = &b;
a = 1;
*p = 2;
d = 3;
c = f(b);
}
Run Code Online (Sandbox Code Playgroud)
该命令frama-c -pdg -pdg-dot graph -pdg-print t.c生成点文件graph.main.dot和graph.f.dot包含的PDG main()和 f()分别.
您可以使用该dot程序来打印其中一个:dot -Tpdf graph.main.dot > graph.pdf
结果如下:

注意从节点c = f(b);到节点的边缘*p = 2;.声称对C程序有用的PDG计算必须处理别名.
另一方面,使用该PDG对标准"语句输入"进行切片的切片器c = f(b);将能够移除d = 3;,即使通过指针访问也不会影响函数调用*p.Frama-C的切片器使用PDG指示的依赖关系来仅保留对用户指定的切片标准有用的语句.例如,该命令frama-c -slice-wr c t.c -then-on 'Slicing export' -print生成下面的简化程序,其中d已删除赋值:
/* Generated by Frama-C */
int a;
int b;
int *p;
int f_slice_1(int x)
{
int __retres;
__retres = a + x;
return (__retres);
}
void main(int c)
{
p = & b;
a = 1;
*p = 2;
c = f_slice_1(b);
return;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4154 次 |
| 最近记录: |