我有一个程序计数器在执行特定代码时所采用的值序列。使用这个,我想对生成这个可执行文件的原始代码进行一些静态分析(要清楚:原始代码不可用) - 特别是,有多少循环,以及它们是如何嵌套的。举个例子,
A: for()
B: if ()
C: ...
D: else
E: ...
F: for () {
G: ...
H: ...
I: }
在这种情况下,程序计数器序列可能是:A B C D F {G H I G H I G H I} A B D E F {G H I G H I} A B D E F {G H I G H I G H I G H I}
从上面的序列中,我怎样才能知道有两个循环,一个嵌套在另一个循环中?只是指向要使用的适当解析技术也会有所帮助。
可以进行一些简化假设,例如原始代码中没有goto,也没有编译器优化的循环展开。
答案 0 :(得分:2)
while{...if{}}
可能会被错误地检测到,如{loop {} ...},具有相同的起始地址'而'和'循环'。由于'起始地址为'不能与任何嵌套循环的起始地址重合,这可以很容易地后处理回while{...if{}}
。 (嵌套' do-while'循环可能具有相同的起始地址,但它们对嵌套' if')没有任何问题。这种方法只能在最简单的情况下工作,如果没有“转移”,“打破”,或任何其他跳出循环以及何时“跳出”。循环只检查一个条件。