使用方舟编译器检查Fastjson OOM问题

思路准备过程编译方舟编译器Fastjson代码分析展望

思路

    通过介入编译期间进行安全检查是类似于Facebook infer类的产品,为什么要这么做呢?源代码安全检查工具粗略分为两个大的流派,一个是类似于coverity,需要编译,厂家集成实现了cov-build这样的编译工具;另一个是checkmarx直接分析语法树进行检查,再上层的例如p3c、pmd、sonarcube都是基于字节码、数据流的规范检查,执行编译有助于将代码规范起来,缓解路径不可达问题降低误报,SAST不能避免软件工程的莱斯定理(Rice’s Theorem)在图灵机的应用:我们可以把任意程序看成一个从输入到输出上的部分函数(Partial Function),该函数描述了程序的行为,关于程序行为的任何非平凡属性,都不存在可以检查该属性的通用算法,误报是允许在得不到精确值的时候,给出近似答案,这个答案就是一定比例的误报或者漏报。本文即尝试类似RoboVM、SVF使用LLVM的思路进行数据流和控制流的软件错误检测。扩展知识可以看下北大熊英飞教授的软件分析技术(Software Analysis)公开课件https://xiongyingfei.github.io/SA/2018/main.htm。

准备

    目前方舟编译器项目已经开源的代码只有少部分,没有支持java语言和虚拟机特性,没有提供Runtime环境,有些关键组件是提供了静态库没有对应实现。可以跑通的有根据java字节码通过jbc2mpl转换出来的中间语言(IR),等待11月份会有完整代码。

    看上图的架构设计,在外部的java代码经过方舟编译器处理ir,然后用编译优化,这一步可以嵌入代码安全检查逻辑,后端优化器编译器不链接语言依赖库,而是生成用于程序分析的中间件。参考了LLVM

    我们不需要程序可以在平台运行,静态分析技术只需要分析“中间表示”(IR)即可进行检查,简单的说法是方舟编译器不是干掉了JDK,而是取代jvm,可以在方舟平台运行apk、jar、class,好处是支持多种语言,下面以Fastjson那“优美”的OOM为例。

过程

构建fastjson oom段的示例代码,去掉Java基本库(基本库有些native的写法,现在假设没有jvm),通过方舟编译器生成.mpl。然后分析IR结构。文章提供每一个步骤介绍通用的代码规范检查的实现步骤。方舟编译器安装的环境配置参考官方文档即可:https://www.openarkcompiler.cn/document/environment,编译器优化可以做很多事、,当然每一步都没有demo可以借鉴,全靠自己摸索。

编译方舟编译器

source ./build/envsetup.sh

make,编译方舟编译器,这里就粘贴大量的console内容了。

Fastjson代码

    现在由于没有java-core包,不能跑通全量fastjson项目代码生成IR,也不能有main方法(因为入参是java.lang.String数组),生成IR的时候会报错,整理复现oom问题的核心代码。

public class OOM {
    protected int sp = 2;
    protected char[] sbuf = new char[]{'\u0000'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值