如何污染 Clang 静态分析器中的命令行参数
How to taint the command line arguments in Clang Static Analyzer
在 Clang Static Analyzer 中,我能够感染任何我感兴趣的 SVal。但是,我想知道如何感染命令行参数。这里有一个简单的例子:
int main(int argc, char **argv)
{
memcpy(xxx,argv[0],xxx);
}
因为没有主函数的调用者,所以我不能使用 precall 或 postcall 来获取 argv 的 SVal 作为以及 callExpr。我想clang一定是提供了这样一个接口来获取top frame函数的arguments.How可以获取吗? beginfunction 是唯一会在顶层框架函数开始时调用的挂钩函数,但 clang 传递给我们的唯一参数是 CheckerContext。我尝试从中获取 SVal,但失败了。
问题已解决!我挂钩 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();
这里我得到的是top frame函数第一个参数的SVal
在 Clang Static Analyzer 中,我能够感染任何我感兴趣的 SVal。但是,我想知道如何感染命令行参数。这里有一个简单的例子:
int main(int argc, char **argv)
{
memcpy(xxx,argv[0],xxx);
}
因为没有主函数的调用者,所以我不能使用 precall 或 postcall 来获取 argv 的 SVal 作为以及 callExpr。我想clang一定是提供了这样一个接口来获取top frame函数的arguments.How可以获取吗? beginfunction 是唯一会在顶层框架函数开始时调用的挂钩函数,但 clang 传递给我们的唯一参数是 CheckerContext。我尝试从中获取 SVal,但失败了。
问题已解决!我挂钩 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();
这里我得到的是top frame函数第一个参数的SVal