<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>The first thing is that there are a couple of things wrong with your plan: global variables have regions, not symbols, and the state of memory is modeled by the Store, not the Environment. checkASTDecl is for syntactic checks, not path-sensitive ones, so of course the globals have no value.</div><div><br></div><div>What you actually need depends a lot on what sort of analysis you’re doing. If you’re trying to verify the <i>initial</i> values of global variables, you can use checkASTDecl and the normal constant-evaluation functions in the AST library. If you’re trying to check the state of all global variables at a particular time…that’s a bit harder, but I’m almost sure you don’t need it. (Why does your checker care about errno, for example?) So, what check are you trying to implement?</div><div><br></div><div>I also recommend you read through the Checker Developer Manual at <a href="http://clang-analyzer.llvm.org/checker_dev_manual.html">http://clang-analyzer.llvm.org/checker_dev_manual.html</a>, or watch the talk linked from there, for a firm grounding in the design of the analyzer and component classes.</div><div><br></div><div>Best,</div><div>Jordan</div><div><br></div><br><div><div>On Nov 11, 2013, at 22:58 , edward jiamu <<a href="mailto:edwardjiamu@gmail.com">edwardjiamu@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hi:<br>    I want to record all the global variables' SymbolRef for analysis. Try<br>the following ways, but failed.<br><br>   1) void check::checkPreStmt(const DeclStmt *DS, CheckerContext &C) const;<br>       only contains the local variables of the analysed function<br><br>   2) void check::checkASTDecl(const VarDecl *TU, AnalysisManager& mgr,<br>                    BugReporter &BR) const<br>      contains the global variables, but no CheckerContext info. so can not<br>convert it to SVal as usual:<br><br>      ProgramStateRef state = C.getState();<br>      SVal sv = state->getSVal(...);<br>      SymbolRef Sym = sv.getAsSymbol();<br><br>   3) depends on "state", how to get the "state" corresponding to the global<br>variables?<br>    Environment env = state->getEnvironment();<br>    for(Environment::iterator it = env.begin(); it != env.end(); ++it)<br>    {<br>        SVal sv = it->second;<br>        //...<br>    }<br><br>    is there correct way?<br><br>Best Regards.<br><br>Jiamu      <br><br><br><br>--<br>View this message in context: <a href="http://clang-developers.42468.n3.nabble.com/How-to-get-global-variables-SymbolRef-tp4035939.html">http://clang-developers.42468.n3.nabble.com/How-to-get-global-variables-SymbolRef-tp4035939.html</a><br>Sent from the Clang Developers mailing list archive at <a href="http://Nabble.com">Nabble.com</a>.<br>_______________________________________________<br>cfe-dev mailing list<br><a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev<br></blockquote></div><br></body></html>