diff options
author | Jan Voung <jvoung@google.com> | 2024-10-28 10:28:02 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-28 10:28:02 -0400 |
commit | 1f6741c1645954b1f4b2fbca470a20081f5e75af (patch) | |
tree | 85859e16e431a66de6bae8611c1b1a74305d7b79 /clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp | |
parent | bd6ab32e6eb642f2b0b15be8c7c2a668192f07d8 (diff) | |
download | llvm-1f6741c1645954b1f4b2fbca470a20081f5e75af.zip llvm-1f6741c1645954b1f4b2fbca470a20081f5e75af.tar.gz llvm-1f6741c1645954b1f4b2fbca470a20081f5e75af.tar.bz2 |
[clang][dataflow] Don't clear cached field state if field is const (#113698)
... in the unchecked optional access model.
Diffstat (limited to 'clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp')
-rw-r--r-- | clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp index b0bd827..31ae2b9 100644 --- a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp +++ b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp @@ -601,10 +601,14 @@ void handleNonConstMemberCall(const CallExpr *CE, dataflow::RecordStorageLocation *RecordLoc, const MatchFinder::MatchResult &Result, LatticeTransferState &State) { - // When a non-const member function is called, reset some state. if (RecordLoc != nullptr) { + // When a non-const member function is called, clear all (non-const) + // optional fields of the receiver. Const-qualified fields can't be + // changed (at least, not without UB). for (const auto &[Field, FieldLoc] : RecordLoc->children()) { - if (isSupportedOptionalType(Field->getType())) { + QualType FieldType = Field->getType(); + if (!FieldType.isConstQualified() && + isSupportedOptionalType(Field->getType())) { auto *FieldRecordLoc = cast_or_null<RecordStorageLocation>(FieldLoc); if (FieldRecordLoc) { setHasValue(*FieldRecordLoc, State.Env.makeAtomicBoolValue(), |