如何在 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);

因为主函数没有调用者,所以我不能使用precallpostcall获取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介绍

推荐的 Clang 命令行选项

如何在 C# 中读取另一个进程的命令行参数?

从命令行使用Homebrew的clang

安装了 Xcode 命令行工具的 Mac OS X 中的 clang-format 和 clang-format.py 在哪里?