Visitar URL original
Unified: Data flow through enum constructors and operators by asgerf · Pull Request #22751 · github/codeql · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
dcdf0a0
unified: Add test with flow through enums
asgerf Oct 5, 2026
7aae4bc
unified: Support flow through enum constructors
asgerf Oct 5, 2026
ce622db
unified: Model postfix "!" as a read step
asgerf Oct 5, 2026
a58747a
unified: Model more unary and cast operators
asgerf Oct 5, 2026
488f131
unified: Add basic flow through arrays
asgerf Oct 5, 2026
a0c937c
unified: Also treat "!" as a taint step and update test output
asgerf Oct 5, 2026
dca1b90
unified: Manually add one-argument version of Data.init(contentsOf:)
asgerf Oct 5, 2026
143aef9
unified: Add path-injection specific step through 'path'
asgerf Oct 5, 2026
7c4a2e8
unified: Dont show ExprPattern in path
asgerf Oct 5, 2026
61fc5fd
unified: Improve join order
asgerf Oct 7, 2026
6ab5435
unified: Record consistency errors
asgerf Oct 8, 2026
677f52e
unified: Add consistency exclusion, but record the miss in a test case
asgerf Oct 8, 2026
c811698
unified: Fix bug in test case
asgerf Oct 8, 2026
c413773
unified: Make the test case type-checkable
asgerf Oct 8, 2026
18f97f7
unified: Mention flattening behavior of 'try?'
asgerf Oct 8, 2026
f1aeecb
unified: Add test case for one-arg Data call
asgerf Oct 8, 2026
9211707
unified: Update test output after rebasing
asgerf Oct 8, 2026
303385e
unified: Fix typo
asgerf Oct 8, 2026
cfc8be4
unified: Remove empty DataFlowConsistency.expected
asgerf Oct 9, 2026
d04059b
unified: Factor out EnumCaseClass
asgerf Oct 9, 2026
f4d4777
unified: Use EnumCaseConstructor in TypeInference
asgerf Oct 9, 2026
e103940
unified: Elaborate QLDoc for enum cases
asgerf Oct 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
unified: Dont show ExprPattern in path
  • Loading branch information
asgerf committed Oct 8, 2026
commit 7c4a2e81d0667cfca97bb8cb1f31abf2ea4fc274
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,10 @@ module DataFlowInput implements InputSig<Location> {
// Misc
//
additional predicate nodeIsVisible(Node node) {
node instanceof TValueNode
exists(Expr e |
node = TValueNode(e) and
not e instanceof ExprPattern
)
or
node instanceof TStrictlyIncomingValue
or
Expand Down
44 changes: 11 additions & 33 deletions unified/ql/test/library-tests/dataflow/test.expected
Original file line number Diff line number Diff line change
Expand Up @@ -42,53 +42,45 @@ edges
| enums.swift:7:13:7:35 | ... .case1(...) [case1.0] | enums.swift:7:9:7:9 | e [case1.0] | provenance | |
| enums.swift:7:21:7:34 | source(...) | enums.swift:7:13:7:35 | ... .case1(...) [case1.0] | provenance | |
| enums.swift:9:12:9:12 | e [case1.0] | enums.swift:10:10:10:23 | ... .case1(...) [case1.0] | provenance | |
| enums.swift:10:10:10:23 | ... .case1(...) [case1.0] | enums.swift:10:18:10:22 | ExprPattern | provenance | |
| enums.swift:10:18:10:22 | ExprPattern | enums.swift:10:22:10:22 | x | provenance | |
| enums.swift:10:10:10:23 | ... .case1(...) [case1.0] | enums.swift:10:22:10:22 | x | provenance | |
| enums.swift:10:22:10:22 | x | enums.swift:11:14:11:14 | x | provenance | |
| enums.swift:18:9:18:9 | e [case1.0] | enums.swift:20:12:20:12 | e [case1.0] | provenance | |
| enums.swift:18:13:18:35 | ... .case1(...) [case1.0] | enums.swift:18:9:18:9 | e [case1.0] | provenance | |
| enums.swift:18:21:18:34 | source(...) | enums.swift:18:13:18:35 | ... .case1(...) [case1.0] | provenance | |
| enums.swift:20:12:20:12 | e [case1.0] | enums.swift:21:10:21:22 | ... .case1(...) [case1.0] | provenance | |
| enums.swift:21:10:21:22 | ... .case1(...) [case1.0] | enums.swift:21:17:21:21 | ExprPattern | provenance | |
| enums.swift:21:17:21:21 | ExprPattern | enums.swift:21:21:21:21 | x | provenance | |
| enums.swift:21:10:21:22 | ... .case1(...) [case1.0] | enums.swift:21:21:21:21 | x | provenance | |
| enums.swift:21:21:21:21 | x | enums.swift:22:14:22:14 | x | provenance | |
| enums.swift:35:9:35:9 | e [case2.0] | enums.swift:36:12:36:12 | e [case2.0] | provenance | |
| enums.swift:35:9:35:9 | e [case2.0] | enums.swift:43:12:43:12 | e [case2.0] | provenance | |
| enums.swift:35:13:35:35 | ... .case2(...) [case2.0] | enums.swift:35:9:35:9 | e [case2.0] | provenance | |
| enums.swift:35:21:35:34 | source(...) | enums.swift:35:13:35:35 | ... .case2(...) [case2.0] | provenance | |
| enums.swift:36:12:36:12 | e [case2.0] | enums.swift:39:10:39:23 | ... .case2(...) [case2.0] | provenance | |
| enums.swift:39:10:39:23 | ... .case2(...) [case2.0] | enums.swift:39:18:39:22 | ExprPattern | provenance | |
| enums.swift:39:18:39:22 | ExprPattern | enums.swift:39:22:39:22 | x | provenance | |
| enums.swift:39:10:39:23 | ... .case2(...) [case2.0] | enums.swift:39:22:39:22 | x | provenance | |
| enums.swift:39:22:39:22 | x | enums.swift:40:14:40:14 | x | provenance | |
| enums.swift:43:12:43:12 | e [case2.0] | enums.swift:44:10:44:23 | ... .case2(...) [case2.0] | provenance | |
| enums.swift:44:10:44:23 | ... .case2(...) [case2.0] | enums.swift:44:18:44:22 | ExprPattern | provenance | |
| enums.swift:44:18:44:22 | ExprPattern | enums.swift:44:22:44:22 | x | provenance | |
| enums.swift:44:10:44:23 | ... .case2(...) [case2.0] | enums.swift:44:22:44:22 | x | provenance | |
| enums.swift:44:22:44:22 | x | enums.swift:45:14:45:14 | x | provenance | |
| enums.swift:52:9:52:13 | opt_x [some.0] | enums.swift:53:19:53:23 | opt_x [some.0] | provenance | |
| enums.swift:52:17:52:45 | ... .some(...) [some.0] | enums.swift:52:9:52:13 | opt_x [some.0] | provenance | |
| enums.swift:52:31:52:44 | source(...) | enums.swift:52:17:52:45 | ... .some(...) [some.0] | provenance | |
| enums.swift:53:11:53:15 | ... .some(...) [some.0] | enums.swift:53:11:53:15 | ExprPattern | provenance | |
| enums.swift:53:11:53:15 | ExprPattern | enums.swift:53:15:53:15 | x | provenance | |
| enums.swift:53:11:53:15 | ... .some(...) [some.0] | enums.swift:53:15:53:15 | x | provenance | |
| enums.swift:53:15:53:15 | x | enums.swift:54:10:54:10 | x | provenance | |
| enums.swift:53:19:53:23 | opt_x [some.0] | enums.swift:53:11:53:15 | ... .some(...) [some.0] | provenance | |
| enums.swift:58:9:58:13 | opt_x [some.0] | enums.swift:59:15:59:19 | opt_x [some.0] | provenance | |
| enums.swift:58:17:58:45 | ... .some(...) [some.0] | enums.swift:58:9:58:13 | opt_x [some.0] | provenance | |
| enums.swift:58:31:58:44 | source(...) | enums.swift:58:17:58:45 | ... .some(...) [some.0] | provenance | |
| enums.swift:59:11:59:19 | ... .some(...) [some.0] | enums.swift:59:11:59:19 | ExprPattern | provenance | |
| enums.swift:59:11:59:19 | ExprPattern | enums.swift:59:15:59:19 | opt_x | provenance | |
| enums.swift:59:11:59:19 | ... .some(...) [some.0] | enums.swift:59:15:59:19 | opt_x | provenance | |
| enums.swift:59:15:59:19 | opt_x | enums.swift:60:10:60:14 | opt_x | provenance | |
| enums.swift:59:15:59:19 | opt_x [some.0] | enums.swift:59:11:59:19 | ... .some(...) [some.0] | provenance | |
| enums.swift:68:9:68:9 | e [foo.0] | enums.swift:69:12:69:12 | e [foo.0] | provenance | |
| enums.swift:68:9:68:9 | e [foo.0] | enums.swift:77:12:77:12 | e [foo.0] | provenance | |
| enums.swift:68:13:68:48 | ... .foo(...) [foo.0] | enums.swift:68:9:68:9 | e [foo.0] | provenance | |
| enums.swift:68:34:68:47 | source(...) | enums.swift:68:13:68:48 | ... .foo(...) [foo.0] | provenance | |
| enums.swift:69:12:69:12 | e [foo.0] | enums.swift:70:10:70:20 | ... .foo(...) [foo.0] | provenance | |
| enums.swift:70:10:70:20 | ... .foo(...) [foo.0] | enums.swift:70:15:70:19 | ExprPattern | provenance | |
| enums.swift:70:15:70:19 | ExprPattern | enums.swift:70:19:70:19 | x | provenance | |
| enums.swift:70:10:70:20 | ... .foo(...) [foo.0] | enums.swift:70:19:70:19 | x | provenance | |
| enums.swift:70:19:70:19 | x | enums.swift:71:14:71:14 | x | provenance | |
| enums.swift:77:12:77:12 | e [foo.0] | enums.swift:78:10:78:23 | ... .foo(...) [foo.0] | provenance | |
| enums.swift:78:10:78:23 | ... .foo(...) [foo.0] | enums.swift:78:18:78:22 | ExprPattern | provenance | |
| enums.swift:78:18:78:22 | ExprPattern | enums.swift:78:22:78:22 | x | provenance | |
| enums.swift:78:10:78:23 | ... .foo(...) [foo.0] | enums.swift:78:22:78:22 | x | provenance | |
| enums.swift:78:22:78:22 | x | enums.swift:79:14:79:14 | x | provenance | |
| implicit-self.swift:16:9:16:12 | [post] self [x] | implicit-self.swift:17:14:17:17 | self [x] | provenance | |
| implicit-self.swift:16:9:16:14 | ... .x | implicit-self.swift:16:9:16:12 | [post] self [x] | provenance | |
Expand Down Expand Up @@ -248,8 +240,7 @@ edges
| test.swift:201:20:201:52 | throwingIdentity(...) | test.swift:201:15:201:52 | try? ... [some.0] | provenance | |
| test.swift:201:37:201:51 | source(...) | test.swift:191:25:191:25 | s | provenance | |
| test.swift:201:37:201:51 | source(...) | test.swift:201:20:201:52 | throwingIdentity(...) | provenance | |
| test.swift:202:8:202:14 | ... .some(...) [some.0] | test.swift:202:8:202:14 | ExprPattern | provenance | |
| test.swift:202:8:202:14 | ExprPattern | test.swift:202:12:202:14 | opt | provenance | |
| test.swift:202:8:202:14 | ... .some(...) [some.0] | test.swift:202:12:202:14 | opt | provenance | |
| test.swift:202:12:202:14 | opt | test.swift:203:14:203:16 | opt | provenance | |
| test.swift:202:12:202:14 | opt [some.0] | test.swift:202:8:202:14 | ... .some(...) [some.0] | provenance | |
| test.swift:205:15:205:47 | throwingIdentity(...) | test.swift:205:10:205:47 | try! ... | provenance | |
Expand All @@ -264,8 +255,7 @@ edges
| test.swift:210:26:210:63 | asyncThrowingIdentity(...) | test.swift:210:20:210:63 | await ... | provenance | |
| test.swift:210:48:210:62 | source(...) | test.swift:193:30:193:30 | s | provenance | |
| test.swift:210:48:210:62 | source(...) | test.swift:210:26:210:63 | asyncThrowingIdentity(...) | provenance | |
| test.swift:211:8:211:14 | ... .some(...) [some.0] | test.swift:211:8:211:14 | ExprPattern | provenance | |
| test.swift:211:8:211:14 | ExprPattern | test.swift:211:12:211:14 | opt | provenance | |
| test.swift:211:8:211:14 | ... .some(...) [some.0] | test.swift:211:12:211:14 | opt | provenance | |
| test.swift:211:12:211:14 | opt | test.swift:212:14:212:16 | opt | provenance | |
| test.swift:211:12:211:14 | opt [some.0] | test.swift:211:8:211:14 | ... .some(...) [some.0] | provenance | |
| test.swift:214:21:214:58 | asyncThrowingIdentity(...) | test.swift:214:10:214:58 | try! ... | provenance | |
Expand All @@ -277,8 +267,7 @@ edges
| test.swift:218:13:218:27 | source(...) | test.swift:218:9:218:9 | x | provenance | |
| test.swift:219:10:219:10 | x | test.swift:219:10:219:20 | TypeCastExpr | provenance | |
| test.swift:220:10:220:10 | x | test.swift:220:10:220:21 | TypeCastExpr | provenance | |
| test.swift:221:8:221:12 | ... .some(...) [some.0] | test.swift:221:8:221:12 | ExprPattern | provenance | |
| test.swift:221:8:221:12 | ExprPattern | test.swift:221:12:221:12 | y | provenance | |
| test.swift:221:8:221:12 | ... .some(...) [some.0] | test.swift:221:12:221:12 | y | provenance | |
| test.swift:221:12:221:12 | y | test.swift:222:14:222:14 | y | provenance | |
| test.swift:221:16:221:16 | x | test.swift:221:16:221:27 | TypeCastExpr [some.0] | provenance | |
| test.swift:221:16:221:27 | TypeCastExpr [some.0] | test.swift:221:8:221:12 | ... .some(...) [some.0] | provenance | |
Expand Down Expand Up @@ -342,43 +331,37 @@ nodes
| enums.swift:7:21:7:34 | source(...) | semmle.label | source(...) |
| enums.swift:9:12:9:12 | e [case1.0] | semmle.label | e [case1.0] |
| enums.swift:10:10:10:23 | ... .case1(...) [case1.0] | semmle.label | ... .case1(...) [case1.0] |
| enums.swift:10:18:10:22 | ExprPattern | semmle.label | ExprPattern |
| enums.swift:10:22:10:22 | x | semmle.label | x |
| enums.swift:11:14:11:14 | x | semmle.label | x |
| enums.swift:18:9:18:9 | e [case1.0] | semmle.label | e [case1.0] |
| enums.swift:18:13:18:35 | ... .case1(...) [case1.0] | semmle.label | ... .case1(...) [case1.0] |
| enums.swift:18:21:18:34 | source(...) | semmle.label | source(...) |
| enums.swift:20:12:20:12 | e [case1.0] | semmle.label | e [case1.0] |
| enums.swift:21:10:21:22 | ... .case1(...) [case1.0] | semmle.label | ... .case1(...) [case1.0] |
| enums.swift:21:17:21:21 | ExprPattern | semmle.label | ExprPattern |
| enums.swift:21:21:21:21 | x | semmle.label | x |
| enums.swift:22:14:22:14 | x | semmle.label | x |
| enums.swift:35:9:35:9 | e [case2.0] | semmle.label | e [case2.0] |
| enums.swift:35:13:35:35 | ... .case2(...) [case2.0] | semmle.label | ... .case2(...) [case2.0] |
| enums.swift:35:21:35:34 | source(...) | semmle.label | source(...) |
| enums.swift:36:12:36:12 | e [case2.0] | semmle.label | e [case2.0] |
| enums.swift:39:10:39:23 | ... .case2(...) [case2.0] | semmle.label | ... .case2(...) [case2.0] |
| enums.swift:39:18:39:22 | ExprPattern | semmle.label | ExprPattern |
| enums.swift:39:22:39:22 | x | semmle.label | x |
| enums.swift:40:14:40:14 | x | semmle.label | x |
| enums.swift:43:12:43:12 | e [case2.0] | semmle.label | e [case2.0] |
| enums.swift:44:10:44:23 | ... .case2(...) [case2.0] | semmle.label | ... .case2(...) [case2.0] |
| enums.swift:44:18:44:22 | ExprPattern | semmle.label | ExprPattern |
| enums.swift:44:22:44:22 | x | semmle.label | x |
| enums.swift:45:14:45:14 | x | semmle.label | x |
| enums.swift:52:9:52:13 | opt_x [some.0] | semmle.label | opt_x [some.0] |
| enums.swift:52:17:52:45 | ... .some(...) [some.0] | semmle.label | ... .some(...) [some.0] |
| enums.swift:52:31:52:44 | source(...) | semmle.label | source(...) |
| enums.swift:53:11:53:15 | ... .some(...) [some.0] | semmle.label | ... .some(...) [some.0] |
| enums.swift:53:11:53:15 | ExprPattern | semmle.label | ExprPattern |
| enums.swift:53:15:53:15 | x | semmle.label | x |
| enums.swift:53:19:53:23 | opt_x [some.0] | semmle.label | opt_x [some.0] |
| enums.swift:54:10:54:10 | x | semmle.label | x |
| enums.swift:58:9:58:13 | opt_x [some.0] | semmle.label | opt_x [some.0] |
| enums.swift:58:17:58:45 | ... .some(...) [some.0] | semmle.label | ... .some(...) [some.0] |
| enums.swift:58:31:58:44 | source(...) | semmle.label | source(...) |
| enums.swift:59:11:59:19 | ... .some(...) [some.0] | semmle.label | ... .some(...) [some.0] |
| enums.swift:59:11:59:19 | ExprPattern | semmle.label | ExprPattern |
| enums.swift:59:15:59:19 | opt_x | semmle.label | opt_x |
| enums.swift:59:15:59:19 | opt_x [some.0] | semmle.label | opt_x [some.0] |
| enums.swift:60:10:60:14 | opt_x | semmle.label | opt_x |
Expand All @@ -387,12 +370,10 @@ nodes
| enums.swift:68:34:68:47 | source(...) | semmle.label | source(...) |
| enums.swift:69:12:69:12 | e [foo.0] | semmle.label | e [foo.0] |
| enums.swift:70:10:70:20 | ... .foo(...) [foo.0] | semmle.label | ... .foo(...) [foo.0] |
| enums.swift:70:15:70:19 | ExprPattern | semmle.label | ExprPattern |
| enums.swift:70:19:70:19 | x | semmle.label | x |
| enums.swift:71:14:71:14 | x | semmle.label | x |
| enums.swift:77:12:77:12 | e [foo.0] | semmle.label | e [foo.0] |
| enums.swift:78:10:78:23 | ... .foo(...) [foo.0] | semmle.label | ... .foo(...) [foo.0] |
| enums.swift:78:18:78:22 | ExprPattern | semmle.label | ExprPattern |
| enums.swift:78:22:78:22 | x | semmle.label | x |
| enums.swift:79:14:79:14 | x | semmle.label | x |
| implicit-self.swift:16:9:16:12 | [post] self [x] | semmle.label | [post] self [x] |
Expand Down Expand Up @@ -598,7 +579,6 @@ nodes
| test.swift:201:20:201:52 | throwingIdentity(...) | semmle.label | throwingIdentity(...) |
| test.swift:201:37:201:51 | source(...) | semmle.label | source(...) |
| test.swift:202:8:202:14 | ... .some(...) [some.0] | semmle.label | ... .some(...) [some.0] |
| test.swift:202:8:202:14 | ExprPattern | semmle.label | ExprPattern |
| test.swift:202:12:202:14 | opt | semmle.label | opt |
| test.swift:202:12:202:14 | opt [some.0] | semmle.label | opt [some.0] |
| test.swift:203:14:203:16 | opt | semmle.label | opt |
Expand All @@ -614,7 +594,6 @@ nodes
| test.swift:210:26:210:63 | asyncThrowingIdentity(...) | semmle.label | asyncThrowingIdentity(...) |
| test.swift:210:48:210:62 | source(...) | semmle.label | source(...) |
| test.swift:211:8:211:14 | ... .some(...) [some.0] | semmle.label | ... .some(...) [some.0] |
| test.swift:211:8:211:14 | ExprPattern | semmle.label | ExprPattern |
| test.swift:211:12:211:14 | opt | semmle.label | opt |
| test.swift:211:12:211:14 | opt [some.0] | semmle.label | opt [some.0] |
| test.swift:212:14:212:16 | opt | semmle.label | opt |
Expand All @@ -628,7 +607,6 @@ nodes
| test.swift:220:10:220:10 | x | semmle.label | x |
| test.swift:220:10:220:21 | TypeCastExpr | semmle.label | TypeCastExpr |
| test.swift:221:8:221:12 | ... .some(...) [some.0] | semmle.label | ... .some(...) [some.0] |
| test.swift:221:8:221:12 | ExprPattern | semmle.label | ExprPattern |
| test.swift:221:12:221:12 | y | semmle.label | y |
| test.swift:221:16:221:16 | x | semmle.label | x |
| test.swift:221:16:221:27 | TypeCastExpr [some.0] | semmle.label | TypeCastExpr [some.0] |
Expand Down