跳转到内容

ROSE 编译器框架/指针分析

来自维基教科书,开放的书籍,为了一个开放的世界

别名关系

[编辑 | 编辑源代码]

访问路径:由变量、指针解引用运算符和结构体字段选择运算符构成的表达式的左值。

  • 对于 C:"*" 解引用,"." 字段选择,"->" 解引用和字段选择

当存在多个访问路径指向同一个存储位置时,就会发生别名现象。访问路径是由变量、指针间接寻址运算符和结构体字段选择运算符构成的表达式的左值。例如,在 C 语言中包括 “*” 解引用运算符、“.”、“->” 运算符等。考虑以下语句

 p = &r;

在这个语句之后,*p 和 r 指向同一个存储位置,因此它们成为彼此的别名,可以表示为关系 <*p, r>。

有两个访问路径

  • 在语句 S 中必须是别名,如果它们在 S 的所有执行实例中都指向同一个存储位置。
  • 在 S 中可能是别名,如果它们在 S 的某些执行实例中指向同一个存储位置。

对于所有访问路径 x,平凡的别名 <x, x> 都成立,前提是 x 不会导致对空指针的解引用。

  • 语义:x 自身是自身别名
  • 如果 x 和 y 是非空指针,则 <x,y> 意味着 <*x, *y>

紧凑表示

[编辑 | 编辑源代码]

每个别名关系都使用紧凑表示

当前实现实现了 Michael Hind、Michael Burke、Paul Carini 和 Jong-Deok Choi。1999. 跨过程指针别名分析。ACM 编程语言系统汇刊。21,4(1999 年 7 月),848-894。 链接

特性

  • 过程内分析:总结每个函数的别名信息
    • 流敏感:考虑控制流路径
  • 跨过程分析:考虑调用图,以在调用图中传播别名信息,以确定对象的“类型”
    • 上下文不敏感:忽略调用栈信息
  • 复杂度:计算指针别名被认为是一个 NP-Hard 问题;因此,该算法使用近似方法来计算别名。
  • 使用紧凑表示图来表示别名信息。

make check 规则

  • [/path/build_rose/tests/roseTests/programAnalysisTests/generalDataFlowAnalysisTests]make verify-pointerAliasAnalysis

我们使用一种原始方法来测试正确性。

  • 输入测试代码:我们添加编译指示来指示预期结果
  • 测试翻译器:将分析生成的格与编译指示信息进行比较。

示例输入代码

[编辑 | 编辑源代码]
// test_ptr2.C
int a;

void foo(int* &x)
{
    int b  = 10;  
    x = &b;
   // x has an alias set {b}
    #pragma rose x:Aliases:{b}{}b:Aliases:{}{}  

}
    
void main()
{   
    int *p;
    a = 20;
    foo(p);
   // p has an alias set {b} due to function call. 
    #pragma rose a:Aliases:{}{}p:Aliases:{b}{}  
}

没有精确的字符串匹配

[编辑 | 编辑源代码]

由于以下原因,不使用精确的字符串匹配

The reason I did that is because unlike other analysis whose lattices contain exact information such as constantPropagation 

(Ex: [VarsExprsProductLattice: level=uninitialized
d: ConstantPropagationLattice:[level: constantValue, val = 9]
] ) my analysis contains temporary memory addresses(since it is a per variable lattice) which may be specific only to that run.

For e.g.,: [VarsExprsProductLattice: level=uninitialized
__expression_0x107b80200-SgIntVal: Aliases:{ }{}
__expression_0x107b80268-SgIntVal: Aliases:{ }{}
__expression_0x107b802d0-SgIntVal: Aliases:{ }{}
__expression_0x107b99a00-SgAssignOp: Aliases:{ }{}
__expression_0x107b99a70-SgAssignOp: Aliases:{ }{("p",p,0) ("a",a,-1)}
__expression_0x107b99ae0-SgAssignOp: Aliases:{ }{("p",p,0) ("b",b,-1)}
__expression_0x107b99b50-SgAssignOp: Aliases:{ }{}
__expression_0x107b99bc0-SgAssignOp: Aliases:{ }{("q",q,0) ("p",p,0)}
__expression_0x107bca800-SgAddressOfOp: Aliases:{ }{}
__expression_0x107bca868-SgAddressOfOp: Aliases:{ }{}
__expression_0x107bca8d0-SgAddressOfOp: Aliases:{ }{}
__expression_0x107c20a00-SgCastExp: Aliases:{ }{}
a: Aliases:{ }{}
b: Aliases:{ }{}
c: Aliases:{ }{}
p: Aliases:{ b }{}
q: Aliases:{ b }{}
x: Aliases:{ }{}
]

In order to verify the correctness of this output, all we need to check is the pointer aliases for the pointer variables -->
a: Aliases:{ }{}
b: Aliases:{ }{}
c: Aliases:{ }{}
p: Aliases:{ b }{}
q: Aliases:{ b }{}
x: Aliases:{ }{}

Since this is only the substring of the complete lattice, I used substr find rather than the exact string match.

I hope this clarifies your question. I will put a note in the code too.

Thanks
Akshatha

待办事项

[编辑 | 编辑源代码]

列表

  • 移动到 rose/src。
  • 为每个新表达式创建临时变量可能没有必要,因为 GDF 支持临时表达式作为对象。

参考文献

[编辑 | 编辑源代码]

相关论文列表

  • David Bacon 和 Peter Sweeney,“C++ 虚拟函数调用的快速静态分析”,OOPSLA'96
  • Michael Burke、Paul Carini、Jong-Deok Choi 和 Michael Hind,“跨过程指针别名分析”,TOPLAS ‘99
  • Paul Carini Harini Srinivasan,“C++ 的流敏感跨过程类型分析”,TechReport ‘95
  • David J. Pearce、Paul H.J. Kelly、Chris Hankin,“C 的高效字段敏感指针分析”,ACM 编程语言和系统汇刊 (TOPLAS),第 30 卷第 1 期,第 4-es 页,2007 年 11 月
华夏公益教科书