使用JCute执行Concolic Testing时遭遇Soot错误求助
解决JCute运行时"Unknown tag in constant pool: 18"错误
首先,这个报错Unknown tag in constant pool: 18 at entry 15的核心原因很明确:JCute的字节码处理工具不识别Java 7及更高版本引入的INVOKEDYNAMIC常量池标签(标签值为18)。作为一款相对老旧的自动化测试工具,JCute对Java 8+的字节码特性兼容性较差,下面是具体的排查和修复步骤:
1. 降级Java运行环境
JCute官方推荐使用Java 6或Java 7早期版本(避免包含INVOKEDYNAMIC相关特性),先检查你当前的Java版本:
java -version
如果输出是Java 8及以上,切换到Java 6/7环境,确保JAVA_HOME和PATH都指向对应版本的Java目录,避免调用系统默认的高版本Java。
2. 修正Instrument命令的语法错误
你的原命令存在几个明显的语法问题,这也可能导致工具解析异常:
-> keep-line-number格式错误,JCute参数应该用-keep-line-number(前缀是短横线而非箭头)> --app MyTest1完全错误,输出重定向符号>后应跟文件路径,--app作为工具参数要放在正确位置
修正后的正确命令如下:
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
注意用&&连接cd和java命令,确保目录切换成功后再执行工具,参数顺序要合规,--app指定的目标类放在最后。
3. 优化环境变量配置
你的环境变量存在冗余和不必要的设置,建议调整为:
export LD_LIBRARY_PATH=/opt/jcute/ export PATH=/opt/jcute/:$PATH # 确保JCute工具优先,同时保留系统原有PATH export CLASSPATH=/opt/jcute/tmpjcute/classes:/opt/jcute/jcute.jar
JAVA_LIB_PATH不是标准环境变量,可直接移除CLASSPATH里重复的jcute.jar要删掉,避免冲突
4. 重编译测试类为低版本字节码
如果你的MyTest1类是用Java 8+编译的,即使运行环境降级,字节码里依然会包含INVOKEDYNAMIC标签。需要用Java 6/7的编译器重新编译:
javac -target 1.6 -source 1.6 MyTest1.java
编译完成后将class文件放到/opt/jcute/tmpjcute/classes目录下,再重新执行Instrument命令。
按以上步骤逐一排查,应该能解决这个常量池标签错误。
内容的提问来源于stack exchange,提问作者Dalia
相关产品推荐
相关产品推荐

