不确定这是应该放在StackOverflow中还是放在不同的StackExchange站点中,如果我把它放错了地方,请原谅!
我目前正在开发一个系统,它可以运行发送给它的代码。有没有办法我可以使用静态分析工具来找出,比如说,是否调用了Runtime.getRuntime().exec()?我知道PMD之类的东西是存在的,但我不知道如何在这个示例中使用它们。
我知道我可以使用Java安全管理器,但这不是我想要的,因为我实际上只是获取代码,将其放在一个文件中,在其上运行javac,然后运行它。
我还知道我可以对该字符串执行正则表达式之类的操作,但是Runtime.getRuntime()可能存储在不同的变量中。
谢谢!
发布于 2019-10-15 15:48:57
另一种可能是获取所有当前线程并检查堆栈跟踪。不过,您需要创建一个观察者线程来不断地检查方法调用。
public static void foo(){
Thread.currentThread();
Map<Thread,StackTraceElement[]> allLiveThreads = Thread.getAllStackTraces();
Set<Entry<Thread,StackTraceElement[]>> entries = allLiveThreads.entrySet();
for(Entry<Thread,StackTraceElement[]> entry : entries){
System.out.print("Thread: '"+ entry.getKey().getName()+"'");
if(entry.getValue().length>1) {
String nameofMethod = entry.getValue()[1].getMethodName();
System.out.println(" and method name '"+ nameofMethod+"()'");
}
else {
System.out.println(" with no methods.");
}
}
}发布于 2019-10-14 03:45:20
一种可能的方法是为Runtime类编写一个包装器,并覆盖所有的exec函数,您可以记录并调用超级函数或删除调用。
在源代码中,您可以在执行Java Runtime之前将其导入替换为包装器类。
https://stackoverflow.com/questions/58365729
复制相似问题