在Clang静态分析器中,我有能力污染任何我感兴趣的SVal。但是,我想知道如何污染命令行参数。一个简单的例子在这里:
int main(int argc, char **argv)
{
memcpy(xxx,argv[0],xxx);
}
因为没有调用主函数的函数,所以我不能使用 precall 或 postcall 来获取argv的SVal以及 callExpr 。我认为clang必须提供了这样的接口来获取顶级框架函数的参数,我怎么能得到它呢? beginfunction 是唯一在顶层框架功能开始时调用的钩子函数,但传递给我们的唯一参数clang是 CheckerContext 。我尝试从中获取SVal,但失败了。
答案 0 :(得分:0)
问题解决了!我钩了 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。