https://github.com/usx95 created https://github.com/llvm/llvm-project/pull/170006
None >From 349c7483a9f83222b97139db1854f6a77a59d4d7 Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena <[email protected]> Date: Sat, 29 Nov 2025 15:49:00 +0000 Subject: [PATCH] dereference_operator --- .../LifetimeSafety/FactsGenerator.cpp | 4 ++++ .../Sema/warn-lifetime-safety-dataflow.cpp | 3 +++ clang/test/Sema/warn-lifetime-safety.cpp | 22 +++++++++---------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp b/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp index 52a74bf40d8a0..c098069720c79 100644 --- a/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp +++ b/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp @@ -223,6 +223,10 @@ void FactsGenerator::VisitUnaryOperator(const UnaryOperator *UO) { // origin of this UnaryOperator expression. killAndFlowOrigin(*UO, *SubExpr); } + if (UO->getOpcode() == UO_Deref) { + const Expr *SubExpr = UO->getSubExpr(); + killAndFlowOrigin(*UO, *SubExpr); + } } void FactsGenerator::VisitReturnStmt(const ReturnStmt *RS) { diff --git a/clang/test/Sema/warn-lifetime-safety-dataflow.cpp b/clang/test/Sema/warn-lifetime-safety-dataflow.cpp index 6d5711deba1cf..d1b3d17fcdd24 100644 --- a/clang/test/Sema/warn-lifetime-safety-dataflow.cpp +++ b/clang/test/Sema/warn-lifetime-safety-dataflow.cpp @@ -152,6 +152,9 @@ void pointer_indirection() { // CHECK-NEXT: Dest: {{[0-9]+}} (Expr: ImplicitCastExpr, Type : int *) // CHECK-NEXT: Src: [[O_PP_INNER]] (Decl: pp, Type : int *) // CHECK: OriginFlow: +// CHECK-NEXT: Dest: {{[0-9]+}} (Expr: UnaryOperator, Type : int *) +// CHECK-NEXT: Src: {{[0-9]+}} (Expr: ImplicitCastExpr, Type : int *) +// CHECK: OriginFlow: // CHECK-NEXT: Dest: {{[0-9]+}} (Expr: ImplicitCastExpr, Type : int *) // CHECK-NEXT: Src: {{[0-9]+}} (Expr: UnaryOperator, Type : int *) // CHECK: OriginFlow: diff --git a/clang/test/Sema/warn-lifetime-safety.cpp b/clang/test/Sema/warn-lifetime-safety.cpp index e62c3b69b040b..f22c73cfeb784 100644 --- a/clang/test/Sema/warn-lifetime-safety.cpp +++ b/clang/test/Sema/warn-lifetime-safety.cpp @@ -596,10 +596,10 @@ const int* return_pointer_to_parameter_via_reference(int a, int b, bool cond) { const int* d = &c; return d; // expected-note 2 {{returned here}} } -// FIXME: Dereference of a pointer does not track the reference. + const int& return_pointer_to_parameter_via_reference_1(int a) { - const int* d = &a; - return *d; + const int* d = &a; // expected-warning {{address of stack memory is returned later}} + return *d; // expected-note {{returned here}} } const int& get_ref_to_local() { @@ -1118,24 +1118,24 @@ struct MyObjStorage { const MyObj *end() const { return objs + 1; } }; -// FIXME: Detect use-after-scope. Dereference pointer does not propagate the origins. void range_based_for_use_after_scope() { View v; { MyObjStorage s; - for (const MyObj &o : s) { + for (const MyObj &o : s) { // expected-warning {{object whose reference is captured does not live long enough}} v = o; } - } - v.use(); + } // expected-note {{destroyed here}} + v.use(); // expected-note {{later used here}} } -// FIXME: Detect use-after-return. Dereference pointer does not propagate the origins. + View range_based_for_use_after_return() { MyObjStorage s; - for (const MyObj &o : s) { - return o; + for (const MyObj &o : s) { // expected-warning {{address of stack memory is returned later}} + return o; // expected-note {{returned here}} } - return *s.begin(); + return *s.begin(); // expected-warning {{address of stack memory is returned later}} + // expected-note@-1 {{returned here}} } void range_based_for_not_reference() { _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
