Skip to content

Commit d3d0a53

Browse files
committed
Rust: Add test showing yet another spurious result.
1 parent 858eec3 commit d3d0a53

File tree

3 files changed

+62
-15
lines changed

3 files changed

+62
-15
lines changed

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

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
| lifetime.rs:659:15:659:18 | ref1 | lifetime.rs:654:31:654:35 | &str1 | lifetime.rs:659:15:659:18 | ref1 | Access of a pointer to $@ after it's lifetime has ended. | lifetime.rs:653:8:653:11 | str1 | str1 |
2121
| lifetime.rs:667:14:667:17 | ref1 | lifetime.rs:654:31:654:35 | &str1 | lifetime.rs:667:14:667:17 | ref1 | Access of a pointer to $@ after it's lifetime has ended. | lifetime.rs:653:8:653:11 | str1 | str1 |
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 it's lifetime has ended. | lifetime.rs:651:7:651:10 | str2 | str2 |
23-
| lifetime.rs:743:10:743:12 | ptr | lifetime.rs:733:9:733:12 | &val | lifetime.rs:743:10:743:12 | ptr | Access of a pointer to $@ after it's lifetime has ended. | lifetime.rs:731:6:731:8 | val | val |
23+
| lifetime.rs:734:12:734:13 | r1 | lifetime.rs:719:26:719:34 | &... | lifetime.rs:734:12:734:13 | r1 | Access of a pointer to $@ after it's lifetime has ended. | lifetime.rs:719:19:719:20 | v2 | v2 |
24+
| lifetime.rs:775:10:775:12 | ptr | lifetime.rs:765:9:765:12 | &val | lifetime.rs:775:10:775:12 | ptr | Access of a pointer to $@ after it's lifetime has ended. | lifetime.rs:763:6:763:8 | val | val |
2425
edges
2526
| deallocation.rs:148:6:148:7 | p1 | deallocation.rs:151:14:151:15 | p1 | provenance | |
2627
| deallocation.rs:148:6:148:7 | p1 | deallocation.rs:158:14:158:15 | p1 | provenance | |
@@ -183,12 +184,17 @@ edges
183184
| lifetime.rs:686:4:687:16 | TupleExpr [tuple.1] | lifetime.rs:684:7:684:14 | TuplePat [tuple.1] | provenance | |
184185
| lifetime.rs:686:5:686:13 | &... | lifetime.rs:686:4:687:16 | TupleExpr [tuple.0] | provenance | |
185186
| lifetime.rs:687:5:687:15 | &... | lifetime.rs:686:4:687:16 | TupleExpr [tuple.1] | provenance | |
186-
| lifetime.rs:724:2:724:12 | &val | lifetime.rs:724:2:724:12 | ptr | provenance | |
187-
| lifetime.rs:724:2:724:12 | ptr | lifetime.rs:725:2:725:12 | ptr | provenance | |
188-
| lifetime.rs:733:2:733:12 | return ... | lifetime.rs:737:12:737:24 | get_pointer(...) | provenance | |
189-
| lifetime.rs:733:9:733:12 | &val | lifetime.rs:733:2:733:12 | return ... | provenance | |
190-
| lifetime.rs:737:6:737:8 | ptr | lifetime.rs:743:10:743:12 | ptr | provenance | |
191-
| lifetime.rs:737:12:737:24 | get_pointer(...) | lifetime.rs:737:6:737:8 | ptr | provenance | |
187+
| lifetime.rs:717:35:723:2 | { ... } | lifetime.rs:730:11:730:25 | e1.test_match() | provenance | |
188+
| lifetime.rs:718:7:718:8 | r1 | lifetime.rs:717:35:723:2 | { ... } | provenance | |
189+
| lifetime.rs:719:26:719:34 | &... | lifetime.rs:718:7:718:8 | r1 | provenance | |
190+
| lifetime.rs:730:6:730:7 | r1 | lifetime.rs:734:12:734:13 | r1 | provenance | |
191+
| lifetime.rs:730:11:730:25 | e1.test_match() | lifetime.rs:730:6:730:7 | r1 | provenance | |
192+
| lifetime.rs:756:2:756:12 | &val | lifetime.rs:756:2:756:12 | ptr | provenance | |
193+
| lifetime.rs:756:2:756:12 | ptr | lifetime.rs:757:2:757:12 | ptr | provenance | |
194+
| lifetime.rs:765:2:765:12 | return ... | lifetime.rs:769:12:769:24 | get_pointer(...) | provenance | |
195+
| lifetime.rs:765:9:765:12 | &val | lifetime.rs:765:2:765:12 | return ... | provenance | |
196+
| lifetime.rs:769:6:769:8 | ptr | lifetime.rs:775:10:775:12 | ptr | provenance | |
197+
| lifetime.rs:769:12:769:24 | get_pointer(...) | lifetime.rs:769:6:769:8 | ptr | provenance | |
192198
models
193199
| 1 | Summary: lang:core; crate::ptr::from_ref; Argument[0]; ReturnValue; value |
194200
nodes
@@ -382,12 +388,18 @@ nodes
382388
| lifetime.rs:692:13:692:14 | r1 | semmle.label | r1 |
383389
| lifetime.rs:693:13:693:14 | r2 | semmle.label | r2 |
384390
| lifetime.rs:694:13:694:14 | r3 | semmle.label | r3 |
385-
| lifetime.rs:724:2:724:12 | &val | semmle.label | &val |
386-
| lifetime.rs:724:2:724:12 | ptr | semmle.label | ptr |
387-
| lifetime.rs:725:2:725:12 | ptr | semmle.label | ptr |
388-
| lifetime.rs:733:2:733:12 | return ... | semmle.label | return ... |
389-
| lifetime.rs:733:9:733:12 | &val | semmle.label | &val |
390-
| lifetime.rs:737:6:737:8 | ptr | semmle.label | ptr |
391-
| lifetime.rs:737:12:737:24 | get_pointer(...) | semmle.label | get_pointer(...) |
392-
| lifetime.rs:743:10:743:12 | ptr | semmle.label | ptr |
391+
| lifetime.rs:717:35:723:2 | { ... } | semmle.label | { ... } |
392+
| lifetime.rs:718:7:718:8 | r1 | semmle.label | r1 |
393+
| lifetime.rs:719:26:719:34 | &... | semmle.label | &... |
394+
| lifetime.rs:730:6:730:7 | r1 | semmle.label | r1 |
395+
| lifetime.rs:730:11:730:25 | e1.test_match() | semmle.label | e1.test_match() |
396+
| lifetime.rs:734:12:734:13 | r1 | semmle.label | r1 |
397+
| lifetime.rs:756:2:756:12 | &val | semmle.label | &val |
398+
| lifetime.rs:756:2:756:12 | ptr | semmle.label | ptr |
399+
| lifetime.rs:757:2:757:12 | ptr | semmle.label | ptr |
400+
| lifetime.rs:765:2:765:12 | return ... | semmle.label | return ... |
401+
| lifetime.rs:765:9:765:12 | &val | semmle.label | &val |
402+
| lifetime.rs:769:6:769:8 | ptr | semmle.label | ptr |
403+
| lifetime.rs:769:12:769:24 | get_pointer(...) | semmle.label | get_pointer(...) |
404+
| lifetime.rs:775:10:775:12 | ptr | semmle.label | ptr |
393405
subpaths

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,38 @@ pub fn test_members() {
703703
mt.test();
704704
}
705705

706+
// --- enum members ---
707+
708+
struct MyValue2 {
709+
value: i64
710+
}
711+
712+
enum MyEnum3 {
713+
Value(MyValue2),
714+
}
715+
716+
impl MyEnum3 {
717+
pub fn test_match(&self) -> &i64 {
718+
let r1 = match self {
719+
MyEnum3::Value(v2) => &v2.value, // $ SPURIOUS: Source[rust/access-after-lifetime-ended]=v2_value
720+
};
721+
722+
r1
723+
}
724+
}
725+
726+
pub fn test_enum_members() {
727+
let v1 = MyValue2 { value: 1 };
728+
let e1 = MyEnum3::Value(v1);
729+
730+
let r1 = e1.test_match();
731+
732+
use_the_stack();
733+
734+
let v3 = *r1; // $ SPURIOUS: Alert[rust/access-after-lifetime-ended]=v2_value
735+
println!(" v3 = {v3}");
736+
}
737+
706738
// --- macros ---
707739

708740
macro_rules! my_macro {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,9 @@ fn main() {
184184
println!("test_members:");
185185
test_members();
186186

187+
println!("test_enum_members:");
188+
test_enum_members();
189+
187190
println!("test_macros:");
188191
test_macros();
189192

0 commit comments

Comments
 (0)