File tree Expand file tree Collapse file tree 3 files changed +40
-4
lines changed
lib/codeql/swift/frameworks/StandardLibrary
test/library-tests/dataflow/taint/libraries Expand file tree Collapse file tree 3 files changed +40
-4
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * Provides models the `RawRepresentable` Swift class.
3
+ */
4
+
5
+ import swift
6
+ private import codeql.swift.dataflow.DataFlow
7
+ private import codeql.swift.dataflow.ExternalFlow
8
+ private import codeql.swift.dataflow.FlowSteps
9
+
10
+ /**
11
+ * A model for `RawRepresentable` class members that permit taint flow.
12
+ */
13
+ private class RawRepresentableSummaries extends SummaryModelCsv {
14
+ override predicate row ( string row ) {
15
+ row = ";RawRepresentable;true;init(rawValue:);;;Argument[0];ReturnValue;taint"
16
+ }
17
+ }
18
+
19
+ /**
20
+ * A content implying that, if an `RawRepresentable` is tainted, then
21
+ * the `rawValue` field is tainted as well.
22
+ */
23
+ private class RawRepresentableFieldsInheritTaint extends TaintInheritingContent ,
24
+ DataFlow:: Content:: FieldContent
25
+ {
26
+ RawRepresentableFieldsInheritTaint ( ) {
27
+ exists ( FieldDecl fieldDecl , Decl declaringDecl , TypeDecl namedTypeDecl |
28
+ namedTypeDecl .getFullName ( ) = "RawRepresentable" and
29
+ fieldDecl .getName ( ) = "rawValue" and
30
+ declaringDecl .getAMember ( ) = fieldDecl and
31
+ declaringDecl .asNominalTypeDecl ( ) = namedTypeDecl .getADerivedTypeDecl * ( ) and
32
+ this .getField ( ) = fieldDecl
33
+ )
34
+ }
35
+ }
Original file line number Diff line number Diff line change @@ -17,6 +17,7 @@ private import NsObject
17
17
private import NsString
18
18
private import NsUrl
19
19
private import Numeric
20
+ private import RawRepresentable
20
21
private import PointerTypes
21
22
private import Sequence
22
23
private import Set
Original file line number Diff line number Diff line change @@ -36,11 +36,11 @@ func testRawRepresentable() {
36
36
37
37
sink ( arg: rr1)
38
38
sink ( arg: rr2)
39
- sink ( arg: rr3) // $ MISSING: tainted=
39
+ sink ( arg: rr3) // $ tainted=35
40
40
41
41
sink ( arg: rr1. rawValue)
42
42
sink ( arg: rr2. rawValue)
43
- sink ( arg: rr3. rawValue) // $ MISSING: tainted=
43
+ sink ( arg: rr3. rawValue) // $ tainted=35
44
44
}
45
45
46
46
// ---
@@ -57,10 +57,10 @@ func testOptionSet() {
57
57
sink ( arg: MyOptionSet . red)
58
58
sink ( arg: MyOptionSet ( [ . red, . green] ) )
59
59
sink ( arg: MyOptionSet ( rawValue: 0 ) )
60
- sink ( arg: MyOptionSet ( rawValue: sourceUInt ( ) ) ) // $ MISSING: tainted=
60
+ sink ( arg: MyOptionSet ( rawValue: sourceUInt ( ) ) ) // $ tainted=60
61
61
62
62
sink ( arg: MyOptionSet . red. rawValue)
63
63
sink ( arg: MyOptionSet ( [ . red, . green] ) . rawValue)
64
64
sink ( arg: MyOptionSet ( rawValue: 0 ) . rawValue)
65
- sink ( arg: MyOptionSet ( rawValue: sourceUInt ( ) ) . rawValue) // $ MISSING: tainted=
65
+ sink ( arg: MyOptionSet ( rawValue: sourceUInt ( ) ) . rawValue) // $ tainted=65
66
66
}
You can’t perform that action at this time.
0 commit comments