我正忙于分析一条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。
我清楚吗?谢谢您的帮助。