Skip to content

Commit d15c468

Browse files
committed
Swift: Add features tom InlineFlowTest.qll: extended source/sink names, custom flow tags, use of line-numbers as a fallback value.
1 parent d56625c commit d15c468

File tree

1 file changed

+34
-11
lines changed

1 file changed

+34
-11
lines changed

swift/ql/test/TestUtilities/InlineFlowTest.qll

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,17 @@ import codeql.swift.dataflow.TaintTracking
4242
import TestUtilities.InlineExpectationsTest
4343

4444
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"])
4652
}
4753

4854
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%") |
5056
sink.asExpr() = ca.getAnArgument().getExpr()
5157
)
5258
}
@@ -59,34 +65,50 @@ module DefaultFlowConfig implements DataFlow::ConfigSig {
5965
int fieldFlowBranchLimit() { result = 1000 }
6066
}
6167

62-
private module NoFlowConfig implements DataFlow::ConfigSig {
68+
module NoFlowConfig implements DataFlow::ConfigSig {
6369
predicate isSource(DataFlow::Node source) { none() }
6470

6571
predicate isSink(DataFlow::Node sink) { none() }
6672
}
6773

74+
private signature string valueFlowTagSig();
75+
76+
private signature string taintFlowTagSig();
77+
78+
string defaultValueFlowTag() { result = "hasValueFlow" }
79+
80+
string defaultTaintFlowTag() { result = "hasTaintFlow" }
81+
6882
private string getSourceArgString(DataFlow::Node src) {
6983
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+
)
7190
}
7291

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+
{
7496
module ValueFlow = DataFlow::Global<ValueFlowConfig>;
7597

7698
module TaintFlow = TaintTracking::Global<TaintFlowConfig>;
7799

78100
private module InlineTest implements TestSig {
79-
string getARelevantTag() { result = ["hasValueFlow", "hasTaintFlow"] }
101+
string getARelevantTag() { result = [valueFlowTag(), taintFlowTag()] }
80102

81103
predicate hasActualResult(Location location, string element, string tag, string value) {
82-
tag = "hasValueFlow" and
104+
tag = valueFlowTag() and
83105
exists(DataFlow::Node src, DataFlow::Node sink | ValueFlow::flow(src, sink) |
84106
sink.getLocation() = location and
85107
element = sink.toString() and
86108
if exists(getSourceArgString(src)) then value = getSourceArgString(src) else value = ""
87109
)
88110
or
89-
tag = "hasTaintFlow" and
111+
tag = taintFlowTag() and
90112
exists(DataFlow::Node src, DataFlow::Node sink |
91113
TaintFlow::flow(src, sink) and not ValueFlow::flow(src, sink)
92114
|
@@ -106,12 +128,13 @@ module FlowTest<DataFlow::ConfigSig ValueFlowConfig, DataFlow::ConfigSig TaintFl
106128
}
107129
}
108130

109-
module DefaultFlowTest = FlowTest<DefaultFlowConfig, DefaultFlowConfig>;
131+
module DefaultFlowTest =
132+
FlowTest<DefaultFlowConfig, DefaultFlowConfig, defaultValueFlowTag/0, defaultTaintFlowTag/0>;
110133

111134
module ValueFlowTest<DataFlow::ConfigSig ValueFlowConfig> {
112-
import FlowTest<ValueFlowConfig, NoFlowConfig>
135+
import FlowTest<ValueFlowConfig, NoFlowConfig, defaultValueFlowTag/0, defaultTaintFlowTag/0>
113136
}
114137

115138
module TaintFlowTest<DataFlow::ConfigSig TaintFlowConfig> {
116-
import FlowTest<NoFlowConfig, TaintFlowConfig>
139+
import FlowTest<NoFlowConfig, TaintFlowConfig, defaultValueFlowTag/0, defaultTaintFlowTag/0>
117140
}

0 commit comments

Comments
 (0)