@@ -42,11 +42,17 @@ import codeql.swift.dataflow.TaintTracking
42
42
import TestUtilities.InlineExpectationsTest
43
43
44
44
private predicate defaultSource ( DataFlow:: Node source ) {
45
- source .asExpr ( ) .( CallExpr ) .getStaticTarget ( ) .( Function ) .getShortName ( ) = [ "source" , "taint" ]
45
+ source
46
+ .asExpr ( )
47
+ .( CallExpr )
48
+ .getStaticTarget ( )
49
+ .( Function )
50
+ .getShortName ( )
51
+ .matches ( [ "source%" , "taint" ] )
46
52
}
47
53
48
54
private predicate defaultSink ( DataFlow:: Node sink ) {
49
- exists ( CallExpr ca | ca .getStaticTarget ( ) .( Function ) .getShortName ( ) = "sink" |
55
+ exists ( CallExpr ca | ca .getStaticTarget ( ) .( Function ) .getShortName ( ) . matches ( "sink%" ) |
50
56
sink .asExpr ( ) = ca .getAnArgument ( ) .getExpr ( )
51
57
)
52
58
}
@@ -59,34 +65,50 @@ module DefaultFlowConfig implements DataFlow::ConfigSig {
59
65
int fieldFlowBranchLimit ( ) { result = 1000 }
60
66
}
61
67
62
- private module NoFlowConfig implements DataFlow:: ConfigSig {
68
+ module NoFlowConfig implements DataFlow:: ConfigSig {
63
69
predicate isSource ( DataFlow:: Node source ) { none ( ) }
64
70
65
71
predicate isSink ( DataFlow:: Node sink ) { none ( ) }
66
72
}
67
73
74
+ private signature string valueFlowTagSig ( ) ;
75
+
76
+ private signature string taintFlowTagSig ( ) ;
77
+
78
+ string defaultValueFlowTag ( ) { result = "hasValueFlow" }
79
+
80
+ string defaultTaintFlowTag ( ) { result = "hasTaintFlow" }
81
+
68
82
private string getSourceArgString ( DataFlow:: Node src ) {
69
83
defaultSource ( src ) and
70
- src .asExpr ( ) .( CallExpr ) .getAnArgument ( ) .getExpr ( ) .( StringLiteralExpr ) .getValue ( ) = result
84
+ (
85
+ src .asExpr ( ) .( CallExpr ) .getAnArgument ( ) .getExpr ( ) .( StringLiteralExpr ) .getValue ( ) = result
86
+ or
87
+ not src .asExpr ( ) .( CallExpr ) .getAnArgument ( ) .getExpr ( ) instanceof StringLiteralExpr and
88
+ result = src .getLocation ( ) .getStartLine ( ) .toString ( )
89
+ )
71
90
}
72
91
73
- module FlowTest< DataFlow:: ConfigSig ValueFlowConfig, DataFlow:: ConfigSig TaintFlowConfig> {
92
+ module FlowTest<
93
+ DataFlow:: ConfigSig ValueFlowConfig, DataFlow:: ConfigSig TaintFlowConfig,
94
+ valueFlowTagSig / 0 valueFlowTag, taintFlowTagSig / 0 taintFlowTag>
95
+ {
74
96
module ValueFlow = DataFlow:: Global< ValueFlowConfig > ;
75
97
76
98
module TaintFlow = TaintTracking:: Global< TaintFlowConfig > ;
77
99
78
100
private module InlineTest implements TestSig {
79
- string getARelevantTag ( ) { result = [ "hasValueFlow" , "hasTaintFlow" ] }
101
+ string getARelevantTag ( ) { result = [ valueFlowTag ( ) , taintFlowTag ( ) ] }
80
102
81
103
predicate hasActualResult ( Location location , string element , string tag , string value ) {
82
- tag = "hasValueFlow" and
104
+ tag = valueFlowTag ( ) and
83
105
exists ( DataFlow:: Node src , DataFlow:: Node sink | ValueFlow:: flow ( src , sink ) |
84
106
sink .getLocation ( ) = location and
85
107
element = sink .toString ( ) and
86
108
if exists ( getSourceArgString ( src ) ) then value = getSourceArgString ( src ) else value = ""
87
109
)
88
110
or
89
- tag = "hasTaintFlow" and
111
+ tag = taintFlowTag ( ) and
90
112
exists ( DataFlow:: Node src , DataFlow:: Node sink |
91
113
TaintFlow:: flow ( src , sink ) and not ValueFlow:: flow ( src , sink )
92
114
|
@@ -106,12 +128,13 @@ module FlowTest<DataFlow::ConfigSig ValueFlowConfig, DataFlow::ConfigSig TaintFl
106
128
}
107
129
}
108
130
109
- module DefaultFlowTest = FlowTest< DefaultFlowConfig , DefaultFlowConfig > ;
131
+ module DefaultFlowTest =
132
+ FlowTest< DefaultFlowConfig , DefaultFlowConfig , defaultValueFlowTag / 0 , defaultTaintFlowTag / 0 > ;
110
133
111
134
module ValueFlowTest< DataFlow:: ConfigSig ValueFlowConfig> {
112
- import FlowTest< ValueFlowConfig , NoFlowConfig >
135
+ import FlowTest< ValueFlowConfig , NoFlowConfig , defaultValueFlowTag / 0 , defaultTaintFlowTag / 0 >
113
136
}
114
137
115
138
module TaintFlowTest< DataFlow:: ConfigSig TaintFlowConfig> {
116
- import FlowTest< NoFlowConfig , TaintFlowConfig >
139
+ import FlowTest< NoFlowConfig , TaintFlowConfig , defaultValueFlowTag / 0 , defaultTaintFlowTag / 0 >
117
140
}
0 commit comments