我需要自动查找java字节码中执行的所有指令。 伪代码中的模拟示例:
x=a; //will be executed for sure
y=b; //will be executed for sure
if(x>y) //will be executed for sure
x++; //might not be executed
else
y++; //might not be executed
k=4; //will be executed for sure
一种可能的解决方案可能是创建控制流图和 找到一条确定性的道路。 (图论?) 根据例子:
x=a;
y=b;
if(x>y)
| \
| \
x++; y++;
| /
| /
k=4;
您是否知道如何找到此任务的解决方案?
答案 0 :(得分:1)
更新:既然已经显示了提问者的实际问题,请点击此处更新的答案。
首先,不需要确定总是执行"的指令。如果你看一下这篇论文,它指的是当用一个特定的输入执行程序时的指令跟踪。要查找指令,只需使用该输入执行程序并记录执行哪些指令(当然这假定程序纯粹是功能性的,是本文中的许多问题之一)。
但是,最重要的问题是为什么要实现这一点。根据我对论文的理解,这不是一个非常有用或有趣的混淆+水印技术。而用Java实现它只会让它变得更糟。
如果你只是为了好玩而实现它,那么就把自己搞得一团糟,但如果你只是想要一个Java水印工具,我会看看像Sandmark这样的现有项目。
原始回答
没有保证执行的指令,因为Thread.stop()
可以在任何时候停止执行。
为了进行有意义的分析,您必须忽略某些类型的错误。例如,Krakatau忽略了Thread.stop
以及大多数VirtualMachineErrors
的可能性。
此时,只需遵循控制流程即可。我不确定你的问题是什么。如果你解释一下你想要完成什么以及项目要求是什么,我可能会建议一个工具。
编辑:如果您试图找到所有在运行时保证由程序执行的指令,而不是静态分析保证,那当然是一个棘手的问题。事实上,它是不可抗拒的。而且我不确定这个用例是什么。