在 Clang 静态分析器中,我可以污染任何我感兴趣的 SVal。但是,我想知道如何污染命令行参数。这里有一个简单的例子:
int main(int argc, char **argv)
{
memcpy(xxx,argv[0],xxx);
}
因为没有主叫方的主要功能,所以我不能使用precall或postcall一开始的argv的SVAL以及callExpr。我认为 clang 必须提供这样一个接口来获取顶级框架函数的参数。我怎么能得到它?beginfunction是唯一一个会在 top frame 函数开始时调用的钩子函数,但传递给我们的唯一参数是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();
在这里我得到了顶帧函数的第一个参数的 SVal。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句