问题标签 [soot]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 异常处理期间的烟灰、标识 stmts 和控制流
我正在尝试在soot
.
让我们反编译
我会将完整的反编译添加到问题的末尾。重要的部分是
和
所以这意味着如果指令 0-6 中的任何一条抛出异常,控制将被重新路由到9
并且执行将像正常一样继续,astore_1
对异常对象的引用存储在局部变量中。
但是,我试图在其中生成一个 try-catch 块,soot
并且发现了一个实际上执行以下操作的示例:CatchWrapInstrumenter.java
根据文档,newTrap
使用给定的 Stmt 处理程序为给定的 Stmt 范围内的给定异常构造一个新的JTrap 。
所以当我们看到
我们可以猜测这本质上是在说“如果thrwCls
在 , 之间的任何 stmts 中抛出类型异常sFirstNonId
,则sGotoLast
跳转到sCatch
.
到目前为止,这符合预期。
现在,困扰我的是
是一个身份证明。
因为身份代表
是定义要使用特殊值(如参数或 this 值)预加载(在方法进入时)的局部变量的语句。
例如, l0 := @this: A 将本地 l0 定义为方法的 this。
这个标识是必要的,因为局部变量没有编号(通常这个变量是字节码级别的局部变量槽 0 中的变量。)
(烟灰纸中的第 31 页 [编号 23] )
所以——再举class A
个例子——如果我要生成(简化)
有意注册
,正如我基于反编译的A.class
那样,这实际上是非法的,因为t := thrownException
应该是“预加载(在方法输入时)”。
然而与此同时,如果煤烟纸第 86 页 [编号 78] 上的示例值得信赖,这正是我们要做的。
这种“预加载”的概念在当时还不存在,对我来说没有多大意义,让我觉得我在控制流上可能是错误的,尽管我不知道怎么做。
有人可以在这里解释一下实际发生的事情吗?
小型 try-catch 示例的完整反编译代码:
java - 添加新 RuntimeException 的抛出
所以我试图在 soot 中插入一个 RuntimeException 并且我写了一个方法来帮助我做到这一点:
这是基于此处找到的示例。
我尝试像这样使用它:
现在的问题是......没有抛出异常。既不是这样,也不是当我newNeExpr
用 a替换时newEqExpr
,也不是当我完全删除 if-check 时。
那么抛出这个异常的正确方法是什么?
更新
生成的检查代码示例(如果我将newEqExpr
取出newNeExpr
,ifnonnull
将变为ifnull
):
java - 将 Soot 用作库时如何设置它?
我想使用 Soot 库从 *.java 文件构建 SSA。但是我发现的所有示例都使用 Soot 作为独立工具,而不是库。谁能给我一个在程序中做的例子吗?
首先,我只是想从源文件中加载我的类并打印它(TestClass.class 在目录中A/home/abdullin/workspace/test
):
但是当我运行它时,我得到运行时异常Aborting: can't find classfile TestClass
。如果我像他们在某些教程中所做的那样更改为,soot 会找到我的课程,但它并不完整Scene.v().getSootClass("TestClass")
。Scene.v().loadClassAndSupport("TestClass")
它打印出类方法的签名,但找不到它们的主体,activeBody
字段为空。
code-analysis - 我可以使用 JDT 生成控制流图吗?
JDT 是否提供任何 API 来生成控制流图?我使用soot生成控制流图,但是我可以使用JDT生成控制流图吗?
java - 更改“静态最终”字段的值
假设我有一个
反汇编的字节码看起来像这样
是的,这让我很惊讶。我本来希望有一个<clinit>
包含分配的方法bar
,然后我可以替换它。final
(当我删除修饰符时确实会发生这种情况。)
如何更改final
字段的值?我要上钩什么?
soot - 无法加载 java.lang.CharSequence 错误
我尝试在 Windows 上使用 Java 版本 8 运行此命令。
java -cp soot.jar soot.Main -cp ".;C:\Program Files\Java\jre1.8.0_151\lib\rt.jar" Example_4
我不断收到:线程“主”java.lang.Error 中的异常:错误:无法加载 java.lang.CharSequence。仅当我将 System.out.print 之类的行作为我的源代码的一部分时才会发生这种情况。否则它工作正常。
源代码
java - 将所有语句从一种方法移动到另一种方法
所以我有一个方法
我现在想拆分此方法,将其主体中的所有内容提取到一个单独的方法中(以编程方式)。
IE
不过,我该怎么做呢?
天真的
不工作。如果我跑,说
我得到一个
java - JCute 执行 Concolic 测试 - 烟尘错误
我尝试使用 JCute 测试一个程序。但是,我一直收到此错误。
cd /opt/jcute/tmpjcute java -Xmx512m -Xms512m -Dcute.sequential=true cute.instrument.CuteInstrumenter -> keep-line-number -d /opt/jcute/tmpjcute/classes -x com.vladium -x cute -x lpsolve > --app MyTest1 env: LD_LIBRARY_PATH=/opt/jcute/ env: JAVA_LIB_PATH=/opt/jcute/ env: PATH=/opt/jcute/:/opt/jcute/ env: CLASSPATH=/opt/jcute/tmpjcute/类:/opt/jcute/jcute.jar:jcute.jar 常量池中的未知标记:条目 15 处的 18 线程“主”java.lang.RuntimeException 中的异常:无法加载类文件:> java.lang.reflect.AnnotatedElement
在 soot.coffi.Util.resolveFromClassFile(Util.java:78) 在 soot.CoffiClassSource.resolve(CoffiClassSource.java:37) 在 soot.SootResolver.bringToHierarchy(SootResolver.java:148) 在 soot.SootResolver.processResolveWorklist(SootResolver. java:105) 在 soot.SootResolver.resolveClass(SootResolver.java:89) 在 soot.Scene.loadClass(Scene.java:329) 在 soot.Scene.loadClassAndSupport(Scene.java:314) 在 cute.instrument.CuteInstrumenter。 main(CuteInstrumenter.java:182) 出口 1
根据此链接: https ://www.se.informatik.uni-kiel.de/en/research/science-blog/soot-tutorial
该错误是由于使用与执行以下命令不同的 java 版本编译要分析的类。
java -cp烟灰罐;soot.Main -cp classes-to-analyze ; 图书馆;-pp soot.Main主类
不幸的是,我不完全理解如何修复错误,因为我只有一个版本的 java。另外,我使用的是 GUI,所以我自己不运行命令。任何帮助表示赞赏。
java - 在 Soot 中创建的类对象的输出类文件
对于测试生成任务,我需要以.class
编程方式生成文件。我正在使用 Soot 框架来生成代码。假设我已经创建了一个类Scene.v().makeSootClass("Test")
并为其添加了一些方法。我现在如何将 Soot IR 结构的虚拟 Java 表示编译为实际.class
文件?
文档列出了他们的命令行界面的一些输出选项,但我想通过 Java 中的 API 以编程方式执行此操作,但我找不到有关如何继续的说明。
soot - 使用 soot 检测 java 类
我正在尝试通过将字节码转换为 jimple、将代码行添加到 jimple 并将 jimple 编译回字节码来检测字节码。问题是我根本无法将 jimple 代码编译回字节码,这可能吗?