分析LLVM IR代码的JumpTable索引

时间:2019-01-02 10:51:42

标签: llvm static-analysis llvm-ir

我正忙于分析一条LLVM IR代码,这些代码具有某些其他语言产生的单个巨大功能。因此,基本上,我需要根据一些函数入口点的知识,从该巨型函数中恢复一些CG和CFG信息。

虽然总体上对我有用,但是一个问题是分析JumpTable。所以基本上,我有很多以JumpTable条目结尾或开始的基本块,例如:

.473:                                             ; preds = %.461, %JumpTable
  call void @check(i64* %gas.ptr, i64 12, i8* %jmpBuf)
  %210 = getelementptr i256, i256* %sp.473, i64 -2
  %211 = load i256, i256* %210, align 16
  %212 = getelementptr i256, i256* %sp.473, i64 -1
  %213 = load i256, i256* %212, align 16
  %214 = getelementptr i256, i256* %sp.473, i64 -2
  store i256 %213, i256* %214, align 16
  br label %JumpTable



.348:                                             ; preds = %.347, %JumpTable
  call void @check(i64* %gas.ptr, i64 9, i8* %jmpBuf)
  %133 = getelementptr i256, i256* %sp.348, i64 -1
  %134 = load i256, i256* %133, align 16
  br label %JumpTable

这是我的JumpTable的外观:

JumpTable:                                        ; preds = %.473, %.348
  %target = phi i256 [ %134, %.348 ], [ %211, %.473 ]
  switch i256 %target, label %Exit [
    i256 66, label %.66
    i256 68, label %.68
    i256 79, label %.79
    i256 81, label %.81
    i256 92, label %.92
    i256 188, label %.188
    i256 202, label %.202
    i256 347, label %.347
    i256 348, label %.348
    i256 350, label %.350
    i256 432, label %.432
    i256 461, label %.461
    i256 473, label %.473
  ]

问题在于,当我遍历CFG时,跳转表的后续块将包含JumpTable可以到达的所有基本块。换句话说,我可能会得到非常不精确的分析结果(是的,当然是“声音”)。

因此,我正在写信问问,进行任何“范围”分析以推断出存储在JumpTable索引中的值是否可行?例如,当遍历到BB .348时,很高兴知道指针%134只能是5或6。

我清楚吗?谢谢您的帮助。

0 个答案:

没有答案