diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll index 60578160d5d..2e10977a95d 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll @@ -212,7 +212,8 @@ predicate capturedCallWrite(Expr call, BasicBlock bb, int i, Variable v) { /** Holds if `v` may be mutably borrowed in `e`. */ private predicate mutablyBorrows(Expr e, Variable v) { e = any(MethodCallExpr mc).getReceiver() and - e.(VariableAccess).getVariable() = v + e.(VariableAccess).getVariable() = v and + v.isMutable() or exists(RefExpr re | re = e and re.isMut() and re.getExpr().(VariableAccess).getVariable() = v) } diff --git a/rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll index 44d060c9823..88a1b815f6b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll @@ -161,7 +161,7 @@ module Impl { } /** Hold is this variable is mutable. */ - predicate isMutable() { this.getPat().isMut() } + predicate isMutable() { this.getPat().isMut() or this.getSelfParam().isMut() } /** Hold is this variable is immutable. */ predicate isImmutable() { not this.isMutable() } diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 68ab8545508..23270af042a 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -316,7 +316,6 @@ localStep | main.rs:263:9:263:10 | i1 | main.rs:263:9:263:10 | i1 | | main.rs:263:14:263:16 | TryExpr | main.rs:263:9:263:10 | i1 | | main.rs:266:5:266:11 | Some(...) | main.rs:260:41:267:1 | { ... } | -| main.rs:270:9:270:10 | [SSA] r1 | main.rs:271:29:271:30 | [SSA] r1 | | main.rs:270:9:270:10 | [SSA] r1 | main.rs:271:29:271:30 | r1 | | main.rs:270:9:270:10 | r1 | main.rs:270:9:270:10 | [SSA] r1 | | main.rs:270:9:270:10 | r1 | main.rs:270:9:270:10 | r1 | @@ -324,7 +323,6 @@ localStep | main.rs:271:9:271:11 | [SSA] o1a | main.rs:273:10:273:12 | o1a | | main.rs:271:9:271:11 | o1a | main.rs:271:9:271:11 | [SSA] o1a | | main.rs:271:9:271:11 | o1a | main.rs:271:9:271:11 | o1a | -| main.rs:271:29:271:30 | [SSA] r1 | main.rs:272:29:272:30 | r1 | | main.rs:271:29:271:30 | [post] r1 | main.rs:272:29:272:30 | r1 | | main.rs:271:29:271:30 | [post] receiver for r1 | main.rs:271:29:271:30 | [post] r1 | | main.rs:271:29:271:30 | r1 | main.rs:271:29:271:30 | receiver for r1 | @@ -340,7 +338,6 @@ localStep | main.rs:273:10:273:12 | o1a | main.rs:273:10:273:12 | receiver for o1a | | main.rs:274:10:274:12 | [post] receiver for o1b | main.rs:274:10:274:12 | [post] o1b | | main.rs:274:10:274:12 | o1b | main.rs:274:10:274:12 | receiver for o1b | -| main.rs:276:9:276:10 | [SSA] r2 | main.rs:277:29:277:30 | [SSA] r2 | | main.rs:276:9:276:10 | [SSA] r2 | main.rs:277:29:277:30 | r2 | | main.rs:276:9:276:10 | r2 | main.rs:276:9:276:10 | [SSA] r2 | | main.rs:276:9:276:10 | r2 | main.rs:276:9:276:10 | r2 | @@ -348,7 +345,6 @@ localStep | main.rs:277:9:277:11 | [SSA] o2a | main.rs:279:10:279:12 | o2a | | main.rs:277:9:277:11 | o2a | main.rs:277:9:277:11 | [SSA] o2a | | main.rs:277:9:277:11 | o2a | main.rs:277:9:277:11 | o2a | -| main.rs:277:29:277:30 | [SSA] r2 | main.rs:278:29:278:30 | r2 | | main.rs:277:29:277:30 | [post] r2 | main.rs:278:29:278:30 | r2 | | main.rs:277:29:277:30 | [post] receiver for r2 | main.rs:277:29:277:30 | [post] r2 | | main.rs:277:29:277:30 | r2 | main.rs:277:29:277:30 | receiver for r2 | @@ -389,24 +385,20 @@ localStep | main.rs:291:9:291:10 | i3 | main.rs:291:9:291:10 | i3 | | main.rs:291:14:291:16 | TryExpr | main.rs:291:9:291:10 | i3 | | main.rs:293:5:293:9 | Ok(...) | main.rs:283:46:294:1 | { ... } | -| main.rs:297:9:297:10 | [SSA] s1 | main.rs:298:10:298:11 | [SSA] s1 | | main.rs:297:9:297:10 | [SSA] s1 | main.rs:298:10:298:11 | s1 | | main.rs:297:9:297:10 | s1 | main.rs:297:9:297:10 | [SSA] s1 | | main.rs:297:9:297:10 | s1 | main.rs:297:9:297:10 | s1 | | main.rs:297:32:297:45 | Ok(...) | main.rs:297:9:297:10 | s1 | -| main.rs:298:10:298:11 | [SSA] s1 | main.rs:299:10:299:11 | s1 | | main.rs:298:10:298:11 | [post] receiver for s1 | main.rs:298:10:298:11 | [post] s1 | | main.rs:298:10:298:11 | [post] s1 | main.rs:299:10:299:11 | s1 | | main.rs:298:10:298:11 | s1 | main.rs:298:10:298:11 | receiver for s1 | | main.rs:298:10:298:11 | s1 | main.rs:299:10:299:11 | s1 | | main.rs:299:10:299:11 | [post] receiver for s1 | main.rs:299:10:299:11 | [post] s1 | | main.rs:299:10:299:11 | s1 | main.rs:299:10:299:11 | receiver for s1 | -| main.rs:301:9:301:10 | [SSA] s2 | main.rs:302:10:302:11 | [SSA] s2 | | main.rs:301:9:301:10 | [SSA] s2 | main.rs:302:10:302:11 | s2 | | main.rs:301:9:301:10 | s2 | main.rs:301:9:301:10 | [SSA] s2 | | main.rs:301:9:301:10 | s2 | main.rs:301:9:301:10 | s2 | | main.rs:301:32:301:46 | Err(...) | main.rs:301:9:301:10 | s2 | -| main.rs:302:10:302:11 | [SSA] s2 | main.rs:303:10:303:11 | s2 | | main.rs:302:10:302:11 | [post] receiver for s2 | main.rs:302:10:302:11 | [post] s2 | | main.rs:302:10:302:11 | [post] s2 | main.rs:303:10:303:11 | s2 | | main.rs:302:10:302:11 | s2 | main.rs:302:10:302:11 | receiver for s2 | @@ -698,16 +690,13 @@ localStep | main.rs:462:16:462:16 | s | main.rs:462:16:462:16 | s | | main.rs:462:16:462:24 | ...: String | main.rs:462:16:462:16 | s | | main.rs:463:14:463:20 | FormatArgsExpr | main.rs:463:14:463:20 | MacroExpr | -| main.rs:467:9:467:9 | [SSA] a | main.rs:468:13:468:13 | [SSA] a | | main.rs:467:9:467:9 | [SSA] a | main.rs:468:13:468:13 | a | | main.rs:467:9:467:9 | a | main.rs:467:9:467:9 | [SSA] a | | main.rs:467:9:467:9 | a | main.rs:467:9:467:9 | a | | main.rs:467:13:467:22 | source(...) | main.rs:467:9:467:9 | a | -| main.rs:468:9:468:9 | [SSA] b | main.rs:469:13:469:13 | [SSA] b | | main.rs:468:9:468:9 | [SSA] b | main.rs:469:13:469:13 | b | | main.rs:468:9:468:9 | b | main.rs:468:9:468:9 | [SSA] b | | main.rs:468:9:468:9 | b | main.rs:468:9:468:9 | b | -| main.rs:468:13:468:13 | [SSA] a | main.rs:472:10:472:10 | a | | main.rs:468:13:468:13 | [post] a | main.rs:472:10:472:10 | a | | main.rs:468:13:468:13 | [post] receiver for a | main.rs:468:13:468:13 | [post] a | | main.rs:468:13:468:13 | a | main.rs:468:13:468:13 | receiver for a | @@ -716,13 +705,9 @@ localStep | main.rs:469:9:469:9 | [SSA] c | main.rs:474:10:474:10 | c | | main.rs:469:9:469:9 | c | main.rs:469:9:469:9 | [SSA] c | | main.rs:469:9:469:9 | c | main.rs:469:9:469:9 | c | -| main.rs:469:13:469:13 | [SSA] b | main.rs:470:19:470:19 | [SSA] b | -| main.rs:469:13:469:13 | [SSA] b | main.rs:470:19:470:19 | b | -| main.rs:469:13:469:13 | [post] b | main.rs:470:19:470:19 | [SSA] b | | main.rs:469:13:469:13 | [post] b | main.rs:470:19:470:19 | b | | main.rs:469:13:469:13 | [post] receiver for b | main.rs:469:13:469:13 | [post] b | | main.rs:469:13:469:13 | b | main.rs:469:13:469:13 | receiver for b | -| main.rs:469:13:469:13 | b | main.rs:470:19:470:19 | [SSA] b | | main.rs:469:13:469:13 | b | main.rs:470:19:470:19 | b | | main.rs:469:13:469:28 | [post] receiver for b.parse(...) | main.rs:469:13:469:28 | [post] b.parse(...) | | main.rs:469:13:469:28 | b.parse(...) | main.rs:469:13:469:28 | receiver for b.parse(...) | @@ -730,7 +715,6 @@ localStep | main.rs:470:9:470:9 | [SSA] d | main.rs:475:10:475:10 | d | | main.rs:470:9:470:9 | d | main.rs:470:9:470:9 | [SSA] d | | main.rs:470:9:470:9 | d | main.rs:470:9:470:9 | d | -| main.rs:470:19:470:19 | [SSA] b | main.rs:473:17:473:17 | b | | main.rs:470:19:470:19 | [post] b | main.rs:473:17:473:17 | b | | main.rs:470:19:470:19 | [post] receiver for b | main.rs:470:19:470:19 | [post] b | | main.rs:470:19:470:19 | b | main.rs:470:19:470:19 | receiver for b | @@ -742,23 +726,16 @@ localStep | main.rs:479:9:479:10 | vs | main.rs:479:9:479:10 | [SSA] vs | | main.rs:479:9:479:10 | vs | main.rs:479:9:479:10 | vs | | main.rs:479:14:479:34 | [...] | main.rs:479:9:479:10 | vs | -| main.rs:481:10:481:11 | [post] vs | main.rs:482:11:482:12 | [SSA] vs | | main.rs:481:10:481:11 | [post] vs | main.rs:482:11:482:12 | vs | -| main.rs:481:10:481:11 | vs | main.rs:482:11:482:12 | [SSA] vs | | main.rs:481:10:481:11 | vs | main.rs:482:11:482:12 | vs | -| main.rs:482:11:482:12 | [SSA] vs | main.rs:483:11:483:12 | [SSA] vs | -| main.rs:482:11:482:12 | [SSA] vs | main.rs:483:11:483:12 | vs | | main.rs:482:11:482:12 | [post] receiver for vs | main.rs:482:11:482:12 | [post] vs | -| main.rs:482:11:482:12 | [post] vs | main.rs:483:11:483:12 | [SSA] vs | | main.rs:482:11:482:12 | [post] vs | main.rs:483:11:483:12 | vs | | main.rs:482:11:482:12 | vs | main.rs:482:11:482:12 | receiver for vs | -| main.rs:482:11:482:12 | vs | main.rs:483:11:483:12 | [SSA] vs | | main.rs:482:11:482:12 | vs | main.rs:483:11:483:12 | vs | | main.rs:482:11:482:19 | [post] receiver for vs.iter(...) | main.rs:482:11:482:19 | [post] vs.iter(...) | | main.rs:482:11:482:19 | vs.iter(...) | main.rs:482:11:482:19 | receiver for vs.iter(...) | | main.rs:482:11:482:26 | ... .next(...) | main.rs:482:11:482:26 | receiver for ... .next(...) | | main.rs:482:11:482:26 | [post] receiver for ... .next(...) | main.rs:482:11:482:26 | [post] ... .next(...) | -| main.rs:483:11:483:12 | [SSA] vs | main.rs:485:14:485:15 | vs | | main.rs:483:11:483:12 | [post] receiver for vs | main.rs:483:11:483:12 | [post] vs | | main.rs:483:11:483:12 | [post] vs | main.rs:485:14:485:15 | vs | | main.rs:483:11:483:12 | vs | main.rs:483:11:483:12 | receiver for vs | @@ -770,29 +747,20 @@ localStep | main.rs:485:9:485:9 | [SSA] v | main.rs:486:14:486:14 | v | | main.rs:485:9:485:9 | v | main.rs:485:9:485:9 | [SSA] v | | main.rs:485:9:485:9 | v | main.rs:485:9:485:9 | v | -| main.rs:485:14:485:15 | vs | main.rs:488:15:488:16 | [SSA] vs | | main.rs:485:14:485:15 | vs | main.rs:488:15:488:16 | vs | | main.rs:488:10:488:10 | [SSA] v | main.rs:489:14:489:14 | v | | main.rs:488:10:488:10 | v | main.rs:488:10:488:10 | [SSA] v | | main.rs:488:10:488:10 | v | main.rs:488:10:488:10 | v | -| main.rs:488:15:488:16 | [SSA] vs | main.rs:492:27:492:28 | [SSA] vs | -| main.rs:488:15:488:16 | [SSA] vs | main.rs:492:27:492:28 | vs | | main.rs:488:15:488:16 | [post] receiver for vs | main.rs:488:15:488:16 | [post] vs | -| main.rs:488:15:488:16 | [post] vs | main.rs:492:27:492:28 | [SSA] vs | | main.rs:488:15:488:16 | [post] vs | main.rs:492:27:492:28 | vs | | main.rs:488:15:488:16 | vs | main.rs:488:15:488:16 | receiver for vs | -| main.rs:488:15:488:16 | vs | main.rs:492:27:492:28 | [SSA] vs | | main.rs:488:15:488:16 | vs | main.rs:492:27:492:28 | vs | | main.rs:492:9:492:11 | [SSA] vs2 | main.rs:493:15:493:17 | vs2 | | main.rs:492:9:492:11 | vs2 | main.rs:492:9:492:11 | [SSA] vs2 | | main.rs:492:9:492:11 | vs2 | main.rs:492:9:492:11 | vs2 | -| main.rs:492:27:492:28 | [SSA] vs | main.rs:497:5:497:6 | [SSA] vs | -| main.rs:492:27:492:28 | [SSA] vs | main.rs:497:5:497:6 | vs | | main.rs:492:27:492:28 | [post] receiver for vs | main.rs:492:27:492:28 | [post] vs | -| main.rs:492:27:492:28 | [post] vs | main.rs:497:5:497:6 | [SSA] vs | | main.rs:492:27:492:28 | [post] vs | main.rs:497:5:497:6 | vs | | main.rs:492:27:492:28 | vs | main.rs:492:27:492:28 | receiver for vs | -| main.rs:492:27:492:28 | vs | main.rs:497:5:497:6 | [SSA] vs | | main.rs:492:27:492:28 | vs | main.rs:497:5:497:6 | vs | | main.rs:492:27:492:35 | [post] receiver for vs.iter(...) | main.rs:492:27:492:35 | [post] vs.iter(...) | | main.rs:492:27:492:35 | vs.iter(...) | main.rs:492:27:492:35 | receiver for vs.iter(...) | @@ -800,13 +768,9 @@ localStep | main.rs:493:10:493:10 | [SSA] v | main.rs:494:14:494:14 | v | | main.rs:493:10:493:10 | v | main.rs:493:10:493:10 | [SSA] v | | main.rs:493:10:493:10 | v | main.rs:493:10:493:10 | v | -| main.rs:497:5:497:6 | [SSA] vs | main.rs:498:5:498:6 | [SSA] vs | -| main.rs:497:5:497:6 | [SSA] vs | main.rs:498:5:498:6 | vs | | main.rs:497:5:497:6 | [post] receiver for vs | main.rs:497:5:497:6 | [post] vs | -| main.rs:497:5:497:6 | [post] vs | main.rs:498:5:498:6 | [SSA] vs | | main.rs:497:5:497:6 | [post] vs | main.rs:498:5:498:6 | vs | | main.rs:497:5:497:6 | vs | main.rs:497:5:497:6 | receiver for vs | -| main.rs:497:5:497:6 | vs | main.rs:498:5:498:6 | [SSA] vs | | main.rs:497:5:497:6 | vs | main.rs:498:5:498:6 | vs | | main.rs:497:5:497:13 | [post] receiver for vs.iter(...) | main.rs:497:5:497:13 | [post] vs.iter(...) | | main.rs:497:5:497:13 | vs.iter(...) | main.rs:497:5:497:13 | receiver for vs.iter(...) | @@ -814,7 +778,6 @@ localStep | main.rs:497:20:497:20 | [SSA] x | main.rs:497:29:497:29 | x | | main.rs:497:20:497:20 | x | main.rs:497:20:497:20 | [SSA] x | | main.rs:497:20:497:20 | x | main.rs:497:20:497:20 | x | -| main.rs:498:5:498:6 | [SSA] vs | main.rs:500:14:500:15 | vs | | main.rs:498:5:498:6 | [post] receiver for vs | main.rs:498:5:498:6 | [post] vs | | main.rs:498:5:498:6 | [post] vs | main.rs:500:14:500:15 | vs | | main.rs:498:5:498:6 | vs | main.rs:498:5:498:6 | receiver for vs |