Skip to content

Commit 8cc4cd5

Browse files
committed
Add failing test for flow out of varargs param with models-as-data
1 parent 96c8af8 commit 8cc4cd5

File tree

7 files changed

+135
-0
lines changed

7 files changed

+135
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
testFailures
2+
invalidModelRow
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/go-all
4+
extensible: summaryModel
5+
data:
6+
- ["github.com/nonexistent/test", "", False, "FunctionWithParameter", "", "", "Argument[0]", "ReturnValue", "value", "manual"]
7+
- ["github.com/nonexistent/test", "", False, "FunctionWithSliceParameter", "", "", "Argument[0].ArrayElement", "ReturnValue", "value", "manual"]
8+
- ["github.com/nonexistent/test", "", False, "FunctionWithVarArgsParameter", "", "", "Argument[0].ArrayElement", "ReturnValue", "value", "manual"]
9+
- ["github.com/nonexistent/test", "", False, "FunctionWithVarArgsOutParameter", "", "", "Argument[0]", "Argument[1].ArrayElement", "value", "manual"]
10+
- ["github.com/nonexistent/test", "", False, "FunctionWithSliceOfStructsParameter", "", "", "Argument[0].ArrayElement.Field[github.com/nonexistent/test.A.Field]", "ReturnValue", "value", "manual"]
11+
- ["github.com/nonexistent/test", "", False, "FunctionWithVarArgsOfStructsParameter", "", "", "Argument[0].ArrayElement.Field[github.com/nonexistent/test.A.Field]", "ReturnValue", "value", "manual"]
12+
- addsTo:
13+
pack: codeql/go-all
14+
extensible: sourceModel
15+
data:
16+
- ["github.com/nonexistent/test", "", False, "VariadicSource", "", "", "Argument[0]", "qltest", "manual"]
17+
- addsTo:
18+
pack: codeql/go-all
19+
extensible: sinkModel
20+
data:
21+
- ["github.com/nonexistent/test", "", False, "VariadicSink", "", "", "Argument[0]", "qltest", "manual"]
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import go
2+
import semmle.go.dataflow.ExternalFlow
3+
import ModelValidation
4+
import TestUtilities.InlineFlowTest
5+
6+
module Config implements DataFlow::ConfigSig {
7+
predicate isSource(DataFlow::Node source) {
8+
sourceNode(source, "qltest")
9+
or
10+
exists(Function fn | fn.hasQualifiedName(_, ["source", "taint"]) |
11+
source = fn.getACall().getResult()
12+
)
13+
}
14+
15+
predicate isSink(DataFlow::Node sink) {
16+
sinkNode(sink, "qltest")
17+
or
18+
exists(Function fn | fn.hasQualifiedName(_, "sink") | sink = fn.getACall().getAnArgument())
19+
}
20+
}
21+
22+
import FlowTest<Config, Config>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module semmle.go.Packages
2+
3+
go 1.23
4+
5+
require github.com/nonexistent/test v0.0.0-20200203000000-0000000000000
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package main
2+
3+
import (
4+
"github.com/nonexistent/test"
5+
)
6+
7+
func source() string {
8+
return "untrusted data"
9+
}
10+
11+
func sink(any) {
12+
}
13+
14+
func main() {
15+
s := source()
16+
sink(test.FunctionWithParameter(s)) // $ hasValueFlow="call to FunctionWithParameter"
17+
18+
stringSlice := []string{source()}
19+
sink(stringSlice[0]) // $ hasValueFlow="index expression"
20+
21+
s0 := ""
22+
s1 := source()
23+
sSlice := []string{s0, s1}
24+
sink(test.FunctionWithParameter(sSlice[1])) // $ hasValueFlow="call to FunctionWithParameter"
25+
sink(test.FunctionWithSliceParameter(sSlice)) // $ hasValueFlow="call to FunctionWithSliceParameter"
26+
sink(test.FunctionWithVarArgsParameter(sSlice...)) // $ hasValueFlow="call to FunctionWithVarArgsParameter"
27+
sink(test.FunctionWithVarArgsParameter(s0, s1)) // $ hasValueFlow="call to FunctionWithVarArgsParameter"
28+
29+
var out1 *string
30+
var out2 *string
31+
test.FunctionWithVarArgsOutParameter(source(), out1, out2)
32+
sink(out1) // $ MISSING: hasValueFlow="out1"
33+
sink(out2) // $ MISSING: hasValueFlow="out2"
34+
35+
sliceOfStructs := []test.A{{Field: source()}}
36+
sink(sliceOfStructs[0].Field) // $ hasValueFlow="selection of Field"
37+
38+
a0 := test.A{Field: ""}
39+
a1 := test.A{Field: source()}
40+
aSlice := []test.A{a0, a1}
41+
sink(test.FunctionWithSliceOfStructsParameter(aSlice)) // $ hasValueFlow="call to FunctionWithSliceOfStructsParameter"
42+
sink(test.FunctionWithVarArgsOfStructsParameter(aSlice...)) // $ hasValueFlow="call to FunctionWithVarArgsOfStructsParameter"
43+
sink(test.FunctionWithVarArgsOfStructsParameter(a0, a1)) // $ hasValueFlow="call to FunctionWithVarArgsOfStructsParameter"
44+
45+
var variadicSource string
46+
test.VariadicSource(&variadicSource)
47+
sink(variadicSource) // $ MISSING: hasTaintFlow="variadicSource"
48+
49+
test.VariadicSink(source()) // $ hasTaintFlow="[]type{args}"
50+
51+
}

go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/github.com/nonexistent/test/stub.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# github.com/nonexistent/test v0.0.0-20200203000000-0000000000000
2+
## explicit
3+
github.com/nonexistent/test

0 commit comments

Comments
 (0)