#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 {
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.
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)) {
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())