Skip to content

Latest commit

 

History

History
27 lines (16 loc) · 2.09 KB

File metadata and controls

27 lines (16 loc) · 2.09 KB

MIAYC-dynamic决赛开发文档

优化策略

决赛阶段的优化参考了论文 Debloating Address Sanitizer

1. 移除重复检查(Removing Recurring Checks)

通过调用sequentialExecuteOptimizationPostDom和sequentialExecuteOptimization函数,SlimASan可以识别并移除那些在同一路径上对同一内存地址的重复检查。

  • 后支配树优化:sequentialExecuteOptimizationPostDom利用后支配树(Post Dominator Tree)分析,如果一个指令后支配另一个指令,且它们访问同一内存地址,则可以安全地移除后一个指令的检查。
  • 控制流分析:sequentialExecuteOptimization在考虑函数调用和内联汇编的情况下执行类似的优化,确保仅在安全的情况下移除检查。

2. 优化相邻检查(Optimizing Neighbor Checks)

通过sequentialExecuteOptimizationBoost函数,SlimASan能够识别并优化对相邻内存位置的访问检查:

  • 移除相邻检查(Removing Neighbor Checks):rmNeighborChks识别三个点A、B、C的模式,其中如果A和C的检查能够保证B的安全性,则可以移除B的检查。
  • 合并相邻检查(Merging Neighbor Checks):mrgNeighborChks将一系列相邻的内存访问检查合并为一个更大范围的检查,显著减少插桩数量。该函数利用64字节的检查范围(CHECK_RANGE),将多个接近的内存访问整合到一个检查中。

3. 优化循环中的检查(Optimizing Checks in Loops)

loopOptimization函数专门针对循环中的内存访问模式进行优化:

  • 循环不变量优化:InvariantOptimizeHandler处理循环不变的内存访问,将检查移出循环,减少执行次数。
  • 单调访问优化:MonotonicOptimizeHandler处理循环中按特定模式(增加或减少)访问数组的情况,通过周期性检查(每32字节检查一次)来减少总体检查量。
  • SCEV分析:利用LLVM的标量演化(Scalar Evolution)分析,识别循环中的访问模式,确定最佳的检查策略。