如何在 Clang 静态分析器中污染命令行参数
Posted
技术标签:
【中文标题】如何在 Clang 静态分析器中污染命令行参数【英文标题】:How to taint the command line arguments in Clang Static Analyzer 【发布时间】:2018-07-11 06:17:55 【问题描述】:在 Clang 静态分析器中,我有能力污染我感兴趣的任何 SVal。但是,我想知道如何污染命令行参数。一个简单的例子:
int main(int argc, char **argv)
memcpy(xxx,argv[0],xxx);
因为主函数没有调用者,所以我不能使用precall或postcall获取argv的SVal以及callExpr时间>。我认为clang一定提供了这样一个接口来获取顶层框架函数的参数。我怎么能得到它? beginfunction 是唯一会在顶部框架函数开始时调用的钩子函数,但唯一传递给我们的参数是 CheckerContext。我尝试从中获取 SVal,但失败了。
【问题讨论】:
总是会调用main
函数。这不是通过您编写的代码完成的。你认为main
会如何被“调用”?我不知道是否有可能接听那个电话。
我没有得到什么:为什么要这样做?对于静态代码分析,程序没有运行,所以你没有命令行参数并且主函数没有执行,所以...?
这只是一个例子,clang静态分析器使用符号执行来查找代码中的问题。确实有一个调用 main 的 start 函数,但这种情况超出了我的主题。在单个 .c 文件中,有许多在文件外调用的函数。但我需要获取顶部框架函数的参数的符号值。
【参考方案1】:
问题解决了!我钩了 beginfunction 代码是
StoreManager & store = C.getStoreManager();
const ParmVarDecl *pdecl = C.getCurrentAnalysisDeclContext()->getDecl()->getAsFunction()->getParamDecl(0);
const Loc loc = store.getLValueVar(pdecl,C.getLocationContext());
ProgramStateRef state = C.getState();
Store s = state->getStore();
store.getBinding(s,loc).dump();
这里我得到顶帧函数的第一个参数的 SVal。
【讨论】:
以上是关于如何在 Clang 静态分析器中污染命令行参数的主要内容,如果未能解决你的问题,请参考以下文章
从命令行使用 clang 编译:兼容性问题 mac os X
iOS测试工具系列| iOS静态代码检查工具Clang Static Analyzer介绍
安装了 Xcode 命令行工具的 Mac OS X 中的 clang-format 和 clang-format.py 在哪里?