static void analyze(clang::Decl *D) { variables.init(D); clang::AnalysisDeclContext ac(/* AnalysisDeclContextManager */ nullptr, D); clang::CFG *cfg; if (!(cfg = ac.getCFG())) exit(1); VisualizeCfg(&ac, cfg); BlockAnalysis blockAnalysis; for (clang::CFG::const_iterator BI = cfg->begin(), BE = cfg->end(); BI != BE; ++BI) { const clang::CFGBlock *block = *BI; blockAnalysis.add(block); } clang::ForwardDataflowWorklist worklist(*cfg, ac); worklist.enqueueBlock(&cfg->getEntry()); while (const clang::CFGBlock *block = worklist.dequeue()) { // Did the block change? bool changed = blockAnalysis.runOnBlock(block); if (blockAnalysis.foundError()) { goto Error; } if (changed) { worklist.enqueueSuccessors(block); } } printf("Fixed point reached\n"); Error: blockAnalysis.print(); }