Skip to content

Commit 06c34fd

Browse files
committed
Rust: Add test case for rust/access-after-lifetime-ended involving a pointer to a struct field.
1 parent c28062a commit 06c34fd

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed

rust/ql/test/query-tests/security/CWE-825/AccessAfterLifetime.expected

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
| lifetime.rs:667:14:667:17 | ref1 | lifetime.rs:655:11:655:25 | &raw const str2 | lifetime.rs:667:14:667:17 | ref1 | Access of a pointer to $@ after its lifetime has ended. | lifetime.rs:651:7:651:10 | str2 | str2 |
2323
| lifetime.rs:789:12:789:13 | p1 | lifetime.rs:781:9:781:19 | &my_local10 | lifetime.rs:789:12:789:13 | p1 | Access of a pointer to $@ after its lifetime has ended. | lifetime.rs:779:6:779:15 | my_local10 | my_local10 |
2424
| lifetime.rs:808:23:808:25 | ptr | lifetime.rs:798:9:798:12 | &val | lifetime.rs:808:23:808:25 | ptr | Access of a pointer to $@ after its lifetime has ended. | lifetime.rs:796:6:796:8 | val | val |
25+
| lifetime.rs:895:13:895:16 | ptr2 | lifetime.rs:880:3:880:23 | &raw const ... | lifetime.rs:895:13:895:16 | ptr2 | Access of a pointer to $@ after its lifetime has ended. | lifetime.rs:879:25:879:28 | self | self |
26+
| lifetime.rs:903:21:903:24 | ptr2 | lifetime.rs:880:3:880:23 | &raw const ... | lifetime.rs:903:21:903:24 | ptr2 | Access of a pointer to $@ after its lifetime has ended. | lifetime.rs:879:25:879:28 | self | self |
2527
| main.rs:64:23:64:24 | p2 | main.rs:44:26:44:28 | &b2 | main.rs:64:23:64:24 | p2 | Access of a pointer to $@ after its lifetime has ended. | main.rs:43:13:43:14 | b2 | b2 |
2628
edges
2729
| deallocation.rs:242:6:242:7 | p1 | deallocation.rs:245:14:245:15 | p1 | provenance | |
@@ -155,6 +157,11 @@ edges
155157
| lifetime.rs:798:9:798:12 | &val | lifetime.rs:798:2:798:12 | return ... | provenance | |
156158
| lifetime.rs:802:6:802:8 | ptr | lifetime.rs:808:23:808:25 | ptr | provenance | |
157159
| lifetime.rs:802:12:802:24 | get_pointer(...) | lifetime.rs:802:6:802:8 | ptr | provenance | |
160+
| lifetime.rs:879:45:882:5 | { ... } | lifetime.rs:892:10:892:23 | obj.get_ptr2() | provenance | |
161+
| lifetime.rs:880:3:880:23 | &raw const ... | lifetime.rs:879:45:882:5 | { ... } | provenance | |
162+
| lifetime.rs:892:3:892:6 | ptr2 | lifetime.rs:895:13:895:16 | ptr2 | provenance | |
163+
| lifetime.rs:892:3:892:6 | ptr2 | lifetime.rs:903:21:903:24 | ptr2 | provenance | |
164+
| lifetime.rs:892:10:892:23 | obj.get_ptr2() | lifetime.rs:892:3:892:6 | ptr2 | provenance | |
158165
| main.rs:18:9:18:10 | p1 [&ref] | main.rs:21:19:21:20 | p1 | provenance | |
159166
| main.rs:18:9:18:10 | p1 [&ref] | main.rs:29:19:29:20 | p1 | provenance | |
160167
| main.rs:18:14:18:29 | ...::as_ptr(...) [&ref] | main.rs:18:9:18:10 | p1 [&ref] | provenance | |
@@ -325,6 +332,12 @@ nodes
325332
| lifetime.rs:802:6:802:8 | ptr | semmle.label | ptr |
326333
| lifetime.rs:802:12:802:24 | get_pointer(...) | semmle.label | get_pointer(...) |
327334
| lifetime.rs:808:23:808:25 | ptr | semmle.label | ptr |
335+
| lifetime.rs:879:45:882:5 | { ... } | semmle.label | { ... } |
336+
| lifetime.rs:880:3:880:23 | &raw const ... | semmle.label | &raw const ... |
337+
| lifetime.rs:892:3:892:6 | ptr2 | semmle.label | ptr2 |
338+
| lifetime.rs:892:10:892:23 | obj.get_ptr2() | semmle.label | obj.get_ptr2() |
339+
| lifetime.rs:895:13:895:16 | ptr2 | semmle.label | ptr2 |
340+
| lifetime.rs:903:21:903:24 | ptr2 | semmle.label | ptr2 |
328341
| main.rs:18:9:18:10 | p1 [&ref] | semmle.label | p1 [&ref] |
329342
| main.rs:18:14:18:29 | ...::as_ptr(...) [&ref] | semmle.label | ...::as_ptr(...) [&ref] |
330343
| main.rs:18:26:18:28 | &b1 | semmle.label | &b1 |

rust/ql/test/query-tests/security/CWE-825/lifetime.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -857,3 +857,50 @@ pub fn test_generic() {
857857
let result = generic_caller::<MyProcessor>();
858858
println!(" result = {result}");
859859
}
860+
861+
// --- struct methods ---
862+
863+
struct MyObjectWithGetters {
864+
value: i64
865+
}
866+
867+
impl MyObjectWithGetters {
868+
pub fn new(_value: i64) -> Self {
869+
Self {
870+
value: _value
871+
}
872+
}
873+
874+
pub unsafe fn get_ptr1(&self) -> *const i64 {
875+
&raw const self.value // $ MISSING: Source[rust/access-after-lifetime-ended]=self_value
876+
// (the returned pointer is valid as long as the containing object is)
877+
}
878+
879+
pub unsafe fn get_ptr2(self) -> *const i64 {
880+
&raw const self.value // $ Source[rust/access-after-lifetime-ended]=self_value
881+
// (the returned pointer is valid as long as the containing object is)
882+
}
883+
}
884+
885+
pub fn test_struct_methods() {
886+
let ptr1: *const i64;
887+
let ptr2: *const i64;
888+
889+
unsafe {
890+
let obj = MyObjectWithGetters::new(1111);
891+
ptr1 = obj.get_ptr1();
892+
ptr2 = obj.get_ptr2();
893+
894+
let v1 = *ptr1;
895+
let v2 = *ptr2; // $ SPURIOUS: Alert[rust/access-after-lifetime-ended]=self_value
896+
println!(" v1 = {}", v1);
897+
println!(" v2 = {}", v2);
898+
}
899+
900+
use_the_stack();
901+
902+
let v3 = unsafe { *ptr1 }; // $ MISSING: Alert[rust/access-after-lifetime-ended]=self_value
903+
let v4 = unsafe { *ptr2 }; // $ Alert[rust/access-after-lifetime-ended]=self_value
904+
println!(" v3 = {} (!)", v3);
905+
println!(" v4 = {} (!)", v4); // corrupt in practice
906+
}

rust/ql/test/query-tests/security/CWE-825/main.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,4 +215,7 @@ fn main() {
215215

216216
println!("test_generic:");
217217
test_generic();
218+
219+
println!("test_struct_methods:");
220+
test_struct_methods();
218221
}

0 commit comments

Comments
 (0)