virtual bool check(SpPoint* pt) { PatchFunction* f = sp::Callee(pt); if (!f) return false; sp_print("StackArrayChecker"); // getAllVariables PatchObject* obj = pt->obj(); using namespace Dyninst::ParseAPI; using namespace Dyninst::SymtabAPI; SymtabCodeSource* cs = static_cast<SymtabCodeSource*>(obj->co()->cs()); Symtab* sym = cs->getSymtabObject(); std::vector<Symbol*> symbols; std::vector<SymtabAPI::Function*> funcs; sym->getAllFunctions(funcs); for (unsigned i = 0; i < funcs.size(); i ++) { if (funcs[i]->getOffset() == f->addr()) { std::vector<localVar*> vars; funcs[i]->getLocalVariables(vars); for (unsigned j = 0; j < vars.size(); j ++) { typeArray* t = vars[j]->getType()->getArrayType(); if (!t) continue; sp_print("%s: [%lx, %lx]", vars[j]->getName().c_str(), t->getLow(), t->getHigh()); } } } return true; }