// Removing the function parameters' MemRegion from the state. This is needed // for PODs where the trivial destructor does not even created nor executed. void MisusedMovedObjectChecker::checkEndFunction(CheckerContext &C) const { auto State = C.getState(); TrackedRegionMapTy Objects = State->get<TrackedRegionMap>(); if (Objects.isEmpty()) return; auto LC = C.getLocationContext(); const auto LD = dyn_cast_or_null<FunctionDecl>(LC->getDecl()); if (!LD) return; llvm::SmallSet<const MemRegion *, 8> InvalidRegions; for (auto Param : LD->parameters()) { auto Type = Param->getType().getTypePtrOrNull(); if (!Type) continue; if (!Type->isPointerType() && !Type->isReferenceType()) { InvalidRegions.insert(State->getLValue(Param, LC).getAsRegion()); } } if (InvalidRegions.empty()) return; for (const auto &E : State->get<TrackedRegionMap>()) { if (InvalidRegions.count(E.first->getBaseRegion())) State = State->remove<TrackedRegionMap>(E.first); } C.addTransition(State); }
void MoveChecker::printState(raw_ostream &Out, ProgramStateRef State, const char *NL, const char *Sep) const { TrackedRegionMapTy RS = State->get<TrackedRegionMap>(); if (!RS.isEmpty()) { Out << Sep << "Moved-from objects :" << NL; for (auto I: RS) { I.first->dumpToStream(Out); if (I.second.isMoved()) Out << ": moved"; else Out << ": moved and reported"; Out << NL; } } }