Charusso updated this revision to Diff 222927. Charusso edited the summary of this revision. Charusso added a comment.
- No comment. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D68199/new/ https://reviews.llvm.org/D68199 Files: clang/include/clang/StaticAnalyzer/Core/PathSensitive/DynamicType.h clang/lib/StaticAnalyzer/Checkers/CastValueChecker.cpp clang/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp clang/lib/StaticAnalyzer/Checkers/IteratorChecker.cpp clang/lib/StaticAnalyzer/Core/CallEvent.cpp clang/lib/StaticAnalyzer/Core/DynamicType.cpp
Index: clang/lib/StaticAnalyzer/Core/DynamicType.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/DynamicType.cpp +++ clang/lib/StaticAnalyzer/Core/DynamicType.cpp @@ -37,7 +37,8 @@ namespace clang { namespace ento { -DynamicTypeInfo getDynamicTypeInfo(ProgramStateRef State, const MemRegion *MR) { +Optional<DynamicTypeInfo> getDynamicTypeInfo(ProgramStateRef State, + const MemRegion *MR) { MR = MR->StripCasts(); // Look up the dynamic type in the GDM. @@ -53,27 +54,30 @@ return DynamicTypeInfo(Sym->getType()); } - return {}; + return None; } -const DynamicTypeInfo *getRawDynamicTypeInfo(ProgramStateRef State, - const MemRegion *MR) { - return State->get<DynamicTypeMap>(MR); +Optional<DynamicTypeInfo> getStoredDynamicTypeInfo(ProgramStateRef State, + const MemRegion *MR) { + if (const DynamicTypeInfo *DTI = State->get<DynamicTypeMap>(MR)) + return *DTI; + + return None; } -const DynamicCastInfo *getDynamicCastInfo(ProgramStateRef State, - const MemRegion *MR, - QualType CastFromTy, - QualType CastToTy) { +Optional<DynamicCastInfo> getDynamicCastInfo(ProgramStateRef State, + const MemRegion *MR, + QualType CastFromTy, + QualType CastToTy) { const auto *Lookup = State->get<DynamicCastMap>().lookup(MR); if (!Lookup) - return nullptr; + return None; for (const DynamicCastInfo &Cast : *Lookup) if (Cast.equals(CastFromTy, CastToTy)) - return &Cast; + return Cast; - return nullptr; + return None; } ProgramStateRef setDynamicTypeInfo(ProgramStateRef State, const MemRegion *MR, Index: clang/lib/StaticAnalyzer/Core/CallEvent.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/CallEvent.cpp +++ clang/lib/StaticAnalyzer/Core/CallEvent.cpp @@ -737,12 +737,12 @@ return {}; // Do we know anything about the type of 'this'? - DynamicTypeInfo DynType = getDynamicTypeInfo(getState(), R); - if (!DynType.isValid()) + Optional<DynamicTypeInfo> DynType = getDynamicTypeInfo(getState(), R); + if (!DynType) return {}; // Is the type a C++ class? (This is mostly a defensive check.) - QualType RegionType = DynType.getType()->getPointeeType(); + QualType RegionType = DynType->getType()->getPointeeType(); assert(!RegionType.isNull() && "DynamicTypeInfo should always be a pointer."); const CXXRecordDecl *RD = RegionType->getAsCXXRecordDecl(); @@ -771,7 +771,7 @@ // Does the decl that we found have an implementation? const FunctionDecl *Definition; if (!Result->hasBody(Definition)) { - if (!DynType.canBeASubClass()) + if (!DynType->canBeASubClass()) return AnyFunctionCall::getRuntimeDefinition(); return {}; } @@ -779,7 +779,7 @@ // We found a definition. If we're not sure that this devirtualization is // actually what will happen at runtime, make sure to provide the region so // that ExprEngine can decide what to do with it. - if (DynType.canBeASubClass()) + if (DynType->canBeASubClass()) return RuntimeDefinition(Definition, R->StripCasts()); return RuntimeDefinition(Definition, /*DispatchRegion=*/nullptr); } @@ -1208,15 +1208,15 @@ if (!Receiver) return {}; - DynamicTypeInfo DTI = getDynamicTypeInfo(getState(), Receiver); - if (!DTI.isValid()) { + Optional<DynamicTypeInfo> DTI = getDynamicTypeInfo(getState(), Receiver); + if (!DTI) { assert(isa<AllocaRegion>(Receiver) && "Unhandled untyped region class!"); return {}; } - QualType DynType = DTI.getType(); - CanBeSubClassed = DTI.canBeASubClass(); + QualType DynType = DTI->getType(); + CanBeSubClassed = DTI->canBeASubClass(); ReceiverT = dyn_cast<ObjCObjectPointerType>(DynType.getCanonicalType()); if (ReceiverT && CanBeSubClassed) Index: clang/lib/StaticAnalyzer/Checkers/IteratorChecker.cpp =================================================================== --- clang/lib/StaticAnalyzer/Checkers/IteratorChecker.cpp +++ clang/lib/StaticAnalyzer/Checkers/IteratorChecker.cpp @@ -1912,10 +1912,10 @@ const CXXRecordDecl *getCXXRecordDecl(ProgramStateRef State, const MemRegion *Reg) { auto TI = getDynamicTypeInfo(State, Reg); - if (!TI.isValid()) + if (!TI) return nullptr; - auto Type = TI.getType(); + auto Type = TI->getType(); if (const auto *RefT = Type->getAs<ReferenceType>()) { Type = RefT->getPointeeType(); } Index: clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp =================================================================== --- clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp +++ clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp @@ -224,8 +224,9 @@ const MemRegion *RecReg = Msg->getReceiverSVal().getAsRegion(); if (!RecReg) return; - DynamicTypeInfo RecDynType = getDynamicTypeInfo(State, RecReg); - C.addTransition(setDynamicTypeInfo(State, RetReg, RecDynType)); + if (Optional<DynamicTypeInfo> RecDynType = + getDynamicTypeInfo(State, RecReg)) + C.addTransition(setDynamicTypeInfo(State, RetReg, *RecDynType)); break; } } @@ -351,12 +352,12 @@ CastE->getType()->getAs<ObjCObjectPointerType>(); if (!NewTy) return nullptr; - QualType OldDTy = getDynamicTypeInfo(C.getState(), ToR).getType(); - if (OldDTy.isNull()) { + Optional<DynamicTypeInfo> OldDTy = getDynamicTypeInfo(C.getState(), ToR); + if (!OldDTy) { return NewTy; } const ObjCObjectPointerType *OldTy = - OldDTy->getAs<ObjCObjectPointerType>(); + OldDTy->getType()->getAs<ObjCObjectPointerType>(); if (!OldTy) return nullptr; @@ -874,7 +875,7 @@ // When there is an entry available for the return symbol in DynamicTypeMap, // the call was inlined, and the information in the DynamicTypeMap is should // be precise. - if (RetRegion && !getRawDynamicTypeInfo(State, RetRegion)) { + if (RetRegion && !getStoredDynamicTypeInfo(State, RetRegion)) { // TODO: we have duplicated information in DynamicTypeMap and // MostSpecializedTypeArgsMap. We should only store anything in the later if // the stored data differs from the one stored in the former. Index: clang/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp =================================================================== --- clang/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp +++ clang/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp @@ -93,13 +93,13 @@ ProgramStateRef State = N->getState(); ProgramStateRef StatePrev = N->getFirstPred()->getState(); - DynamicTypeInfo TrackedType = getDynamicTypeInfo(State, Reg); - DynamicTypeInfo TrackedTypePrev = getDynamicTypeInfo(StatePrev, Reg); - if (!TrackedType.isValid()) + Optional<DynamicTypeInfo> TrackedType = getDynamicTypeInfo(State, Reg); + Optional<DynamicTypeInfo> TrackedTypePrev = + getDynamicTypeInfo(StatePrev, Reg); + if (!TrackedType) return nullptr; - if (TrackedTypePrev.isValid() && - TrackedTypePrev.getType() == TrackedType.getType()) + if (TrackedTypePrev && TrackedTypePrev->getType() == TrackedType->getType()) return nullptr; // Retrieve the associated statement. @@ -112,7 +112,7 @@ SmallString<256> Buf; llvm::raw_svector_ostream OS(Buf); OS << "Type '"; - QualType::print(TrackedType.getType().getTypePtr(), Qualifiers(), OS, + QualType::print(TrackedType->getType().getTypePtr(), Qualifiers(), OS, LangOpts, llvm::Twine()); OS << "' is inferred from "; @@ -162,12 +162,12 @@ return; ProgramStateRef State = C.getState(); - DynamicTypeInfo DynTypeInfo = getDynamicTypeInfo(State, Region); + Optional<DynamicTypeInfo> DynTypeInfo = getDynamicTypeInfo(State, Region); - if (!DynTypeInfo.isValid()) + if (!DynTypeInfo) return; - QualType DynType = DynTypeInfo.getType(); + QualType DynType = DynTypeInfo->getType(); QualType StaticType = CE->getType(); const auto *DynObjCType = DynType->getAs<ObjCObjectPointerType>(); @@ -192,7 +192,7 @@ if (ASTCtxt.canAssignObjCInterfaces(StaticObjCType, DynObjCType)) return; - if (DynTypeInfo.canBeASubClass() && + if (DynTypeInfo->canBeASubClass() && ASTCtxt.canAssignObjCInterfaces(DynObjCType, StaticObjCType)) return; Index: clang/lib/StaticAnalyzer/Checkers/CastValueChecker.cpp =================================================================== --- clang/lib/StaticAnalyzer/Checkers/CastValueChecker.cpp +++ clang/lib/StaticAnalyzer/Checkers/CastValueChecker.cpp @@ -92,7 +92,7 @@ }; } // namespace -static bool isInfeasibleCast(const DynamicCastInfo *CastInfo, +static bool isInfeasibleCast(Optional<DynamicCastInfo> CastInfo, bool CastSucceeds) { if (!CastInfo) return false; @@ -101,7 +101,7 @@ } static const NoteTag *getNoteTag(CheckerContext &C, - const DynamicCastInfo *CastInfo, + Optional<DynamicCastInfo> CastInfo, QualType CastToTy, const Expr *Object, bool CastSucceeds, bool IsKnownCast) { std::string CastToName = @@ -182,7 +182,7 @@ } const MemRegion *MR = DV.getAsRegion(); - const DynamicCastInfo *CastInfo = + Optional<DynamicCastInfo> CastInfo = getDynamicCastInfo(State, MR, CastFromTy, CastToTy); // We assume that every checked cast succeeds. @@ -228,7 +228,7 @@ return; const MemRegion *MR = DV.getAsRegion(); - const DynamicCastInfo *CastInfo = + Optional<DynamicCastInfo> CastInfo = getDynamicCastInfo(State, MR, CastFromTy, CastToTy); bool CastSucceeds; Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/DynamicType.h =================================================================== --- clang/include/clang/StaticAnalyzer/Core/PathSensitive/DynamicType.h +++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/DynamicType.h @@ -30,17 +30,18 @@ namespace ento { /// Get dynamic type information for the region \p MR. -DynamicTypeInfo getDynamicTypeInfo(ProgramStateRef State, const MemRegion *MR); - -/// Get raw dynamic type information for the region \p MR. -const DynamicTypeInfo *getRawDynamicTypeInfo(ProgramStateRef State, +Optional<DynamicTypeInfo> getDynamicTypeInfo(ProgramStateRef State, const MemRegion *MR); +/// Get the stored dynamic type information for the region \p MR. +Optional<DynamicTypeInfo> getStoredDynamicTypeInfo(ProgramStateRef State, + const MemRegion *MR); + /// Get dynamic cast information from \p CastFromTy to \p CastToTy of \p MR. -const DynamicCastInfo *getDynamicCastInfo(ProgramStateRef State, - const MemRegion *MR, - QualType CastFromTy, - QualType CastToTy); +Optional<DynamicCastInfo> getDynamicCastInfo(ProgramStateRef State, + const MemRegion *MR, + QualType CastFromTy, + QualType CastToTy); /// Set dynamic type information of the region; return the new state. ProgramStateRef setDynamicTypeInfo(ProgramStateRef State, const MemRegion *MR,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits