Skip to content

Commit 1c7deeb

Browse files
committed
dereference_operator
1 parent 651cb0b commit 1c7deeb

File tree

3 files changed

+18
-11
lines changed

3 files changed

+18
-11
lines changed

clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,10 @@ void FactsGenerator::VisitUnaryOperator(const UnaryOperator *UO) {
218218
// origin of this UnaryOperator expression.
219219
killAndFlowOrigin(*UO, *SubExpr);
220220
}
221+
if (UO->getOpcode() == UO_Deref) {
222+
const Expr *SubExpr = UO->getSubExpr();
223+
killAndFlowOrigin(*UO, *SubExpr);
224+
}
221225
}
222226

223227
void FactsGenerator::VisitReturnStmt(const ReturnStmt *RS) {

clang/test/Sema/warn-lifetime-safety-dataflow.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ void pointer_indirection() {
152152
// CHECK-NEXT: Dest: {{[0-9]+}} (Expr: ImplicitCastExpr, Type : int *)
153153
// CHECK-NEXT: Src: [[O_PP_INNER]] (Decl: pp, Type : int *)
154154
// CHECK: OriginFlow:
155+
// CHECK-NEXT: Dest: {{[0-9]+}} (Expr: UnaryOperator, Type : int *)
156+
// CHECK-NEXT: Src: {{[0-9]+}} (Expr: ImplicitCastExpr, Type : int *)
157+
// CHECK: OriginFlow:
155158
// CHECK-NEXT: Dest: {{[0-9]+}} (Expr: ImplicitCastExpr, Type : int *)
156159
// CHECK-NEXT: Src: {{[0-9]+}} (Expr: UnaryOperator, Type : int *)
157160
// CHECK: OriginFlow:

clang/test/Sema/warn-lifetime-safety.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -596,10 +596,10 @@ const int* return_pointer_to_parameter_via_reference(int a, int b, bool cond) {
596596
const int* d = &c;
597597
return d; // expected-note 2 {{returned here}}
598598
}
599-
// FIXME: Dereference of a pointer does not track the reference.
599+
600600
const int& return_pointer_to_parameter_via_reference_1(int a) {
601-
const int* d = &a;
602-
return *d;
601+
const int* d = &a; // expected-warning {{address of stack memory is returned later}}
602+
return *d; // expected-note {{returned here}}
603603
}
604604

605605
const int& get_ref_to_local() {
@@ -1118,24 +1118,24 @@ struct MyObjStorage {
11181118
const MyObj *end() const { return objs + 1; }
11191119
};
11201120

1121-
// FIXME: Detect use-after-scope. Dereference pointer does not propagate the origins.
11221121
void range_based_for_use_after_scope() {
11231122
View v;
11241123
{
11251124
MyObjStorage s;
1126-
for (const MyObj &o : s) {
1125+
for (const MyObj &o : s) { // expected-warning {{object whose reference is captured does not live long enough}}
11271126
v = o;
11281127
}
1129-
}
1130-
v.use();
1128+
} // expected-note {{destroyed here}}
1129+
v.use(); // expected-note {{later used here}}
11311130
}
1132-
// FIXME: Detect use-after-return. Dereference pointer does not propagate the origins.
1131+
11331132
View range_based_for_use_after_return() {
11341133
MyObjStorage s;
1135-
for (const MyObj &o : s) {
1136-
return o;
1134+
for (const MyObj &o : s) { // expected-warning {{address of stack memory is returned later}}
1135+
return o; // expected-note {{returned here}}
11371136
}
1138-
return *s.begin();
1137+
return *s.begin(); // expected-warning {{address of stack memory is returned later}}
1138+
// expected-note@-1 {{returned here}}
11391139
}
11401140

11411141
void range_based_for_not_reference() {

0 commit comments

Comments
 (0)