[cfe-commits] r167000 - in /cfe/trunk: include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp

Jordan Rose jordan_rose at apple.com
Tue Oct 30 09:18:51 PDT 2012


On Oct 29, 2012, at 21:17 , Anna Zaks <ganna at apple.com> wrote:

> Author: zaks
> Date: Mon Oct 29 23:17:40 2012
> New Revision: 167000
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=167000&view=rev
> Log:
> [analyzer] Fix a bug in REGISTER_MAP_WITH_PROGRAMSTATE
> 
> The ImmutableMap should not be the key into the GDM map as there could
> be several entries with the same map type. Thanks, Jordan.
> 
> This complicates the usage of the macro a bit. When we want to retrieve
> the whole map, we need to use another name. Currently, I set it to be
> Name ## Ty as in "type of the map we are storing in the ProgramState".

Not bad. I wonder if we can do better, though (untested):

class Name : public llvm::ImmutableMap<Key, Value> {
  explicit Name(const ImmutableMap::TreeTy *Root) : ImmutableMap(Root) {}
};

It makes the macro a bit uglier, because of the constructor, but it does reunify the lookup type and the map type. Maybe it's not worth it, though. What do you think?


> Modified:
>    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
>    cfe/trunk/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h?rev=167000&r1=166999&r2=167000&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h Mon Oct 29 23:17:40 2012
> @@ -18,20 +18,21 @@
> #include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
> #include "llvm/ADT/ImmutableMap.h"
> 
> -/// Declare an immutable map suitable for placement into the ProgramState.
> -#define REGISTER_MAP_WITH_PROGRAMSTATE(Map, Key, Value) \
> -  typedef llvm::ImmutableMap<Key, Value> Map; \
> +/// Declares an immutable map of type NameTy, suitable for placement into
> +/// the ProgramState. The macro should not be used inside namespaces.
> +#define REGISTER_MAP_WITH_PROGRAMSTATE(Name, Key, Value) \
> +  class Name {}; \
> +  typedef llvm::ImmutableMap<Key, Value> Name ## Ty; \
>   namespace clang { \
>   namespace ento { \
>     template <> \
> -    struct ProgramStateTrait<Map> \
> -      : public ProgramStatePartialTrait<Map> { \
> +    struct ProgramStateTrait<Name> \
> +      : public ProgramStatePartialTrait<Name ## Ty> { \
>       static void *GDMIndex() { static int Index; return &Index; } \
>     }; \
>   } \
>   }
> 
> -
> namespace clang {
> namespace ento {
> 
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp?rev=167000&r1=166999&r2=167000&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp Mon Oct 29 23:17:40 2012
> @@ -106,9 +106,7 @@
>                                        CheckerContext &C) const {
>   initIdentifierInfo(C.getASTContext());
> 
> -  if (C.getCalleeIdentifier(Call) != IIfclose)
> -    return;
> -  if (Call->getNumArgs() != 1)
> +  if (C.getCalleeIdentifier(Call) != IIfclose || Call->getNumArgs() != 1)
>     return;
> 
>   // Get the symbolic value corresponding to the file handle.
> @@ -130,9 +128,9 @@
> void SimpleStreamChecker::checkDeadSymbols(SymbolReaper &SymReaper,
>                                            CheckerContext &C) const {
>   ProgramStateRef State = C.getState();
> -  StreamMap TrackedStreams = State->get<StreamMap>();
> +  StreamMapTy TrackedStreams = State->get<StreamMap>();
>   SymbolVector LeakedStreams;
> -  for (StreamMap::iterator I = TrackedStreams.begin(),
> +  for (StreamMapTy::iterator I = TrackedStreams.begin(),
>                            E = TrackedStreams.end(); I != E; ++I) {
>     SymbolRef Sym = I->first;
>     if (SymReaper.isDead(Sym)) {
> @@ -154,9 +152,9 @@
> ProgramStateRef SimpleStreamChecker::evalAssume(ProgramStateRef State,
>                                                 SVal Cond,
>                                                 bool Assumption) const {
> -  StreamMap TrackedStreams = State->get<StreamMap>();
> +  StreamMapTy TrackedStreams = State->get<StreamMap>();
>   SymbolVector LeakedStreams;
> -  for (StreamMap::iterator I = TrackedStreams.begin(),
> +  for (StreamMapTy::iterator I = TrackedStreams.begin(),
>                            E = TrackedStreams.end(); I != E; ++I) {
>     SymbolRef Sym = I->first;
>     if (State->getConstraintManager().isNull(State, Sym).isTrue())
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list