@@ -78,6 +78,7 @@ determineElementSize(const std::optional<QualType> T, const CheckerContext &C) {
7878}
7979
8080class StateUpdateReporter {
81+ const MemSpaceRegion *Space;
8182 const SubRegion *Reg;
8283 const NonLoc ByteOffsetVal;
8384 const std::optional<QualType> ElementType;
@@ -88,8 +89,8 @@ class StateUpdateReporter {
8889public:
8990 StateUpdateReporter (const SubRegion *R, NonLoc ByteOffsVal, const Expr *E,
9091 CheckerContext &C)
91- : Reg(R), ByteOffsetVal(ByteOffsVal ),
92- ElementType (determineElementType(E, C)),
92+ : Space(R-> getMemorySpace (C.getState())), Reg(R ),
93+ ByteOffsetVal(ByteOffsVal), ElementType(determineElementType(E, C)),
9394 ElementSize(determineElementSize(ElementType, C)) {}
9495
9596 void recordNonNegativeAssumption () { AssumedNonNegative = true ; }
@@ -352,7 +353,8 @@ compareValueToThreshold(ProgramStateRef State, NonLoc Value, NonLoc Threshold,
352353 return {nullptr , nullptr };
353354}
354355
355- static std::string getRegionName (const SubRegion *Region) {
356+ static std::string getRegionName (const MemSpaceRegion *Space,
357+ const SubRegion *Region) {
356358 if (std::string RegName = Region->getDescriptiveName (); !RegName.empty ())
357359 return RegName;
358360
@@ -367,8 +369,7 @@ static std::string getRegionName(const SubRegion *Region) {
367369 if (isa<AllocaRegion>(Region))
368370 return " the memory returned by 'alloca'" ;
369371
370- if (isa<SymbolicRegion>(Region) &&
371- isa<HeapSpaceRegion>(Region->getMemorySpace ()))
372+ if (isa<SymbolicRegion>(Region) && isa<HeapSpaceRegion>(Space))
372373 return " the heap area" ;
373374
374375 if (isa<StringRegion>(Region))
@@ -388,8 +389,9 @@ static std::optional<int64_t> getConcreteValue(std::optional<NonLoc> SV) {
388389 return SV ? getConcreteValue (*SV) : std::nullopt ;
389390}
390391
391- static Messages getPrecedesMsgs (const SubRegion *Region, NonLoc Offset) {
392- std::string RegName = getRegionName (Region), OffsetStr = " " ;
392+ static Messages getPrecedesMsgs (const MemSpaceRegion *Space,
393+ const SubRegion *Region, NonLoc Offset) {
394+ std::string RegName = getRegionName (Space, Region), OffsetStr = " " ;
393395
394396 if (auto ConcreteOffset = getConcreteValue (Offset))
395397 OffsetStr = formatv (" {0}" , ConcreteOffset);
@@ -418,10 +420,11 @@ static bool tryDividePair(std::optional<int64_t> &Val1,
418420 return true ;
419421}
420422
421- static Messages getExceedsMsgs (ASTContext &ACtx, const SubRegion *Region,
422- NonLoc Offset, NonLoc Extent, SVal Location,
423+ static Messages getExceedsMsgs (ASTContext &ACtx, const MemSpaceRegion *Space,
424+ const SubRegion *Region, NonLoc Offset,
425+ NonLoc Extent, SVal Location,
423426 bool AlsoMentionUnderflow) {
424- std::string RegName = getRegionName (Region);
427+ std::string RegName = getRegionName (Space, Region);
425428 const auto *EReg = Location.getAsRegion ()->getAs <ElementRegion>();
426429 assert (EReg && " this checker only handles element access" );
427430 QualType ElemType = EReg->getElementType ();
@@ -468,9 +471,10 @@ static Messages getExceedsMsgs(ASTContext &ACtx, const SubRegion *Region,
468471 std::string (Buf)};
469472}
470473
471- static Messages getTaintMsgs (const SubRegion *Region, const char *OffsetName,
474+ static Messages getTaintMsgs (const MemSpaceRegion *Space,
475+ const SubRegion *Region, const char *OffsetName,
472476 bool AlsoMentionUnderflow) {
473- std::string RegName = getRegionName (Region);
477+ std::string RegName = getRegionName (Space, Region);
474478 return {formatv (" Potential out of bound access to {0} with tainted {1}" ,
475479 RegName, OffsetName),
476480 formatv (" Access of {0} with a tainted {1} that may be {2}too large" ,
@@ -539,7 +543,7 @@ std::string StateUpdateReporter::getMessage(PathSensitiveBugReport &BR) const {
539543 << " ' elements in " ;
540544 else
541545 Out << " the extent of " ;
542- Out << getRegionName (Reg);
546+ Out << getRegionName (Space, Reg);
543547 }
544548 return std::string (Out.str ());
545549}
@@ -589,7 +593,7 @@ void ArrayBoundChecker::performCheck(const Expr *E, CheckerContext &C) const {
589593 StateUpdateReporter SUR (Reg, ByteOffset, E, C);
590594
591595 // CHECK LOWER BOUND
592- const MemSpaceRegion *Space = Reg->getMemorySpace ();
596+ const MemSpaceRegion *Space = Reg->getMemorySpace (State );
593597 if (!(isa<SymbolicRegion>(Reg) && isa<UnknownSpaceRegion>(Space))) {
594598 // A symbolic region in unknown space represents an unknown pointer that
595599 // may point into the middle of an array, so we don't look for underflows.
@@ -632,7 +636,7 @@ void ArrayBoundChecker::performCheck(const Expr *E, CheckerContext &C) const {
632636 } else {
633637 if (!WithinLowerBound) {
634638 // ...and it cannot be valid (>= 0), so report an error.
635- Messages Msgs = getPrecedesMsgs (Reg, ByteOffset);
639+ Messages Msgs = getPrecedesMsgs (Space, Reg, ByteOffset);
636640 reportOOB (C, PrecedesLowerBound, Msgs, ByteOffset, std::nullopt );
637641 return ;
638642 }
@@ -675,8 +679,8 @@ void ArrayBoundChecker::performCheck(const Expr *E, CheckerContext &C) const {
675679 }
676680
677681 Messages Msgs =
678- getExceedsMsgs (C.getASTContext (), Reg, ByteOffset, *KnownSize ,
679- Location, AlsoMentionUnderflow);
682+ getExceedsMsgs (C.getASTContext (), Space, Reg, ByteOffset ,
683+ *KnownSize, Location, AlsoMentionUnderflow);
680684 reportOOB (C, ExceedsUpperBound, Msgs, ByteOffset, KnownSize);
681685 return ;
682686 }
@@ -692,7 +696,8 @@ void ArrayBoundChecker::performCheck(const Expr *E, CheckerContext &C) const {
692696 if (isTainted (State, ASE->getIdx (), C.getLocationContext ()))
693697 OffsetName = " index" ;
694698
695- Messages Msgs = getTaintMsgs (Reg, OffsetName, AlsoMentionUnderflow);
699+ Messages Msgs =
700+ getTaintMsgs (Space, Reg, OffsetName, AlsoMentionUnderflow);
696701 reportOOB (C, ExceedsUpperBound, Msgs, ByteOffset, KnownSize,
697702 /* IsTaintBug=*/ true );
698703 return ;
0 commit comments