栈安全性分析
简介
栈安全性分析用于判定栈上分配的变量是否可以视为“安全”的,即不易发生内存访问错误。
该分析的主要用途是为各种 Sanitizer(如内存安全检查器)提供信息,帮助它们避免对“安全”变量做无谓的插桩处理。SafeStack 将是首批使用者之一。
“安全”变量定义为:这些变量不会被作用域外使用(如 use-after-return),也不会发生越界访问。将来还可以扩展此分析以追踪其他变量属性,例如:我们计划加入变量读前必定初始化的检查,以便优化 use-of-uninitialized-memory 的检测。
工作原理
该分析分为两阶段实现:
-
过程内(local)分析阶段:在函数内部进行深度优先搜索,收集每个 alloca(局部栈变量)的所有使用情况,包括 load/store 以及作为参数传递给函数。完成后,我们就知道哪些变量的哪些部分被本函数本身使用,但尚不清楚作为参数传递给其它函数后的情况。
-
跨过程(global)分析阶段:解决 allocas 作为参数传递给其它函数后的所有影响。本阶段在单个 Module 内对函数调用进行深度优先搜索,将 alloca 的使用信息在调用图上传播。
结合 ThinLTO 使用时,global 阶段会基于模块摘要索引(Module Summary Index)做全程序分析。
测试
该分析配有 lit 测试用例。
我们期望用户能够容忍把“安全”变量判为“不安全”的假阳性(这只会导致代码效率下降),但绝不能容忍“安全”误判(假阴性),否则可能导致 Sanitizer 漏报实际的内存错误。为保障这点,我们希望能有额外的验证工具。
AddressSanitizer 就可以用于辅助验证:我们可以像往常一样对所有变量插桩,然后在 ASanStackVariableDescription 中记录 stack-safe 信息。如果 AddressSanitizer 检测到某个“安全”变量出现了内存错误,则可生成额外报告,提醒用户栈安全性分析可能有误,需要查Bug。
原文地址:https://llvm.org/docs/StackSafetyAnalysis.html
1692

被折叠的 条评论
为什么被折叠?



