================
@@ -396,6 +396,131 @@ void loan_from_previous_iteration(MyObj safe, bool 
condition) {
   }             // expected-note {{destroyed here}}
 }
 
+//===----------------------------------------------------------------------===//
+// Basic Definite Use-After-Return (Return-Stack-Address) (-W...permissive)
+// These are cases where the pointer is guaranteed to be dangling at the use 
site.
+//===----------------------------------------------------------------------===//
+
+MyObj* simple_return_stack_address(){
+  MyObj s;      
+  MyObj* p = &s; // expected-warning {{returning reference to stack allocated 
object}}
+  return p;      // expected-note {{returned here}}
+}
+
+MyObj* conditional_assign_unconditional_return(MyObj safe, bool c){
+  MyObj s; 
+  MyObj* p = &safe;
+  if(c){
+    p = &s;       // expected-warning {{returning reference to stack allocated 
object}}
+  }     
+  return p;      // expected-note {{returned here}}
+}
+
+View conditional_assign_both_branches(MyObj safe, bool c){
+
+  MyObj s;
+  View p;
+  if (c) {
+    p = s;      // expected-warning {{returning reference to stack allocated 
object}}
+  } else {
+    p = safe;
+  }
+  return p;     // expected-note {{returned here}}
+
+}
+
+View reassign_safe_to_local(MyObj safe){
+  MyObj local;
+  View p = safe;
+
+  p = local;    // expected-warning {{returning reference to stack allocated 
object}}
+  return p;     // expected-note {{returned here}}
+}
+
+View pointer_chain_to_local(){
+  MyObj local;
+  View p1 = local;     // expected-warning {{returning reference to stack 
allocated object}}
+
+  View p2 = p1; 
+
+  return p2;          // expected-note {{returned here}}
+}
+
+View multiple_assign_multiple_return(MyObj safe, bool c1, bool c2){
+  MyObj local1;
+  MyObj local2;
+  View p;
+  if(c1){
+    p = local1;       // expected-warning {{returning reference to stack 
allocated object}}
+    return p;         // expected-note {{returned here}}
+  }
+  else if(c2){
+    p = local2;       // expected-warning {{returning reference to stack 
allocated object}}
+    return p;         // expected-note {{returned here}}
+  }
+  p = safe;
+  return p;
+}
+
+View multiple_assign_single_return(MyObj safe, bool c1, bool c2){
+  MyObj local1;
+  MyObj local2;
+  View p;
+  if(c1){
+    p = local1;      // expected-warning {{returning reference to stack 
allocated object}}
+  }
+  else if(c2){
+    p = local2;      // expected-warning {{returning reference to stack 
allocated object}}
+  }
+  else{
+    p = safe;
+  }
+  
+  return p;         // expected-note 2 {{returned here}}
+}
+
+View direct_return_of_local(){
+  MyObj stack;      
+  return stack;     // expected-warning {{returning reference to stack 
allocated object}}
+                    // expected-note@-1 {{returned here}}
+}
+
+MyObj& reference_return_of_local(){
+  MyObj stack;      
+  return stack;     // expected-warning {{returning reference to stack 
allocated object}}
+                    // expected-note@-1 {{returned here}}
+                    // expected-warning@-2 {{reference to stack memory 
associated with local variable 'stack' returned}}
----------------
kashika0112 wrote:

Done

https://github.com/llvm/llvm-project/pull/165370
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to