Skip to content

Commit 553bc8c

Browse files
authored
Merge pull request #18108 from owen-mc/go/mad/model-slices-package
Go: model `slices` package (skipping functions that involve iterating over a function)
2 parents 36acfeb + 141259c commit 553bc8c

File tree

5 files changed

+231
-3
lines changed

5 files changed

+231
-3
lines changed

go/ql/lib/ext/slices.model.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/go-all
4+
extensible: summaryModel
5+
data:
6+
# All should be modeled when we have a way to model iterators
7+
# AppendSec should be modeled when we have a way to model iterators
8+
# Backward should be modeled when we have a way to model iterators
9+
# Chunk should be modeled when we have a way to model iterators
10+
- ["slices", "", False, "Clip", "", "", "Argument[0].ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
11+
- ["slices", "", False, "Clone", "", "", "Argument[0].ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
12+
# Collect should be modeled when we have a way to model iterators
13+
- ["slices", "", False, "Compact", "", "", "Argument[0].ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
14+
- ["slices", "", False, "CompactFunc", "", "", "Argument[0].ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
15+
- ["slices", "", False, "Concat", "", "", "Argument[0].ArrayElement.ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
16+
- ["slices", "", False, "Delete", "", "", "Argument[0].ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
17+
- ["slices", "", False, "DeleteFunc", "", "", "Argument[0].ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
18+
- ["slices", "", False, "Grow", "", "", "Argument[0].ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
19+
- ["slices", "", False, "Insert", "", "", "Argument[0].ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
20+
- ["slices", "", False, "Insert", "", "", "Argument[2].ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
21+
- ["slices", "", False, "Max", "", "", "Argument[0].ArrayElement", "ReturnValue", "value", "manual"]
22+
- ["slices", "", False, "MaxFunc", "", "", "Argument[0].ArrayElement", "ReturnValue", "value", "manual"]
23+
- ["slices", "", False, "Min", "", "", "Argument[0].ArrayElement", "ReturnValue", "value", "manual"]
24+
- ["slices", "", False, "MinFunc", "", "", "Argument[0].ArrayElement", "ReturnValue", "value", "manual"]
25+
- ["slices", "", False, "Repeat", "", "", "Argument[0].ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
26+
- ["slices", "", False, "Replace", "", "", "Argument[0].ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
27+
- ["slices", "", False, "Replace", "", "", "Argument[3].ArrayElement", "ReturnValue.ArrayElement", "value", "manual"]
28+
# Sorted should be modeled when we have a way to model iterators
29+
# SortedFunc should be modeled when we have a way to model iterators
30+
# SortedStableFunc should be modeled when we have a way to model iterators
31+
# Values should be modeled when we have a way to model iterators
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Added value flow models for functions in the `slices` package which do not involve the `iter` package.
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
package main
2+
3+
import (
4+
"cmp"
5+
"slices"
6+
"strings"
7+
)
8+
9+
func TaintStepTest_SlicesClip(fromStringSlice []string) []string {
10+
toStringSlice := slices.Clip(fromStringSlice)
11+
return toStringSlice
12+
}
13+
14+
func TaintStepTest_SlicesClone(fromStringSlice []string) []string {
15+
toStringSlice := slices.Clone(fromStringSlice)
16+
return toStringSlice
17+
}
18+
19+
func TaintStepTest_SlicesCompact(fromStringSlice []string) []string {
20+
toStringSlice := slices.Compact(fromStringSlice)
21+
return toStringSlice
22+
}
23+
24+
func TaintStepTest_SlicesCompactFunc(fromStringSlice []string) []string {
25+
toStringSlice := slices.CompactFunc(fromStringSlice, strings.EqualFold)
26+
return toStringSlice
27+
}
28+
29+
func TaintStepTest_SlicesConcat0(fromStringSlice []string) []string {
30+
toStringSlice := slices.Concat(fromStringSlice, []string{"a", "b", "c"})
31+
return toStringSlice
32+
}
33+
34+
func TaintStepTest_SlicesConcat1(fromStringSlice []string) []string {
35+
toStringSlice := slices.Concat([]string{"a", "b", "c"}, fromStringSlice)
36+
return toStringSlice
37+
}
38+
39+
func TaintStepTest_SlicesDelete(fromStringSlice []string) []string {
40+
toStringSlice := slices.Delete(fromStringSlice, 0, 1)
41+
return toStringSlice
42+
}
43+
44+
func TaintStepTest_SlicesDeleteFunc(fromStringSlice []string) []string {
45+
deleteEmptyString := func(str string) bool {
46+
return str == ""
47+
}
48+
toStringSlice := slices.DeleteFunc(fromStringSlice, deleteEmptyString)
49+
return toStringSlice
50+
}
51+
52+
func TaintStepTest_SlicesGrow(fromStringSlice []string) []string {
53+
toStringSlice := slices.Grow(fromStringSlice, 1)
54+
return toStringSlice
55+
}
56+
57+
func TaintStepTest_SlicesInsert0(fromStringSlice []string) []string {
58+
toStringSlice := slices.Insert(fromStringSlice, 1, "a", "b")
59+
return toStringSlice
60+
}
61+
62+
func TaintStepTest_SlicesInsert2(fromString string) []string {
63+
toStringSlice := slices.Insert([]string{}, 0, fromString, "b")
64+
return toStringSlice
65+
}
66+
67+
func TaintStepTest_SlicesMax(fromStringSlice []string) string {
68+
toString := slices.Max(fromStringSlice)
69+
return toString
70+
}
71+
72+
func TaintStepTest_SlicesMaxFunc(fromStringSlice []string) string {
73+
toString := slices.MaxFunc(fromStringSlice, cmp.Compare)
74+
return toString
75+
}
76+
77+
func TaintStepTest_SlicesMin(fromStringSlice []string) string {
78+
toString := slices.Min(fromStringSlice)
79+
return toString
80+
}
81+
82+
func TaintStepTest_SlicesMinFunc(fromStringSlice []string) string {
83+
toString := slices.MinFunc(fromStringSlice, cmp.Compare)
84+
return toString
85+
}
86+
87+
func TaintStepTest_SlicesRepeat(fromStringSlice []string) []string {
88+
toStringSlice := slices.Repeat(fromStringSlice, 2)
89+
return toStringSlice
90+
}
91+
92+
func TaintStepTest_SlicesReplace0(fromStringSlice []string) []string {
93+
toStringSlice := slices.Replace(fromStringSlice, 1, 2, "a")
94+
return toStringSlice
95+
}
96+
97+
func TaintStepTest_SlicesReplace3(fromString string) []string {
98+
toStringSlice := slices.Replace([]string{}, 1, 3, fromString, "b")
99+
return toStringSlice
100+
}
101+
102+
func RunAllTaints_Slices() {
103+
{
104+
source := []string{newSource(0).(string)}
105+
out := TaintStepTest_SlicesClip(source)
106+
sink(0, out[0])
107+
}
108+
{
109+
source := []string{newSource(1).(string)}
110+
out := TaintStepTest_SlicesClone(source)
111+
sink(1, out[0])
112+
}
113+
{
114+
source := []string{newSource(2).(string)}
115+
out := TaintStepTest_SlicesCompact(source)
116+
sink(2, out[0])
117+
}
118+
{
119+
source := []string{newSource(3).(string)}
120+
out := TaintStepTest_SlicesCompactFunc(source)
121+
sink(3, out[0])
122+
}
123+
{
124+
source := []string{newSource(4).(string)}
125+
out := TaintStepTest_SlicesConcat0(source)
126+
sink(4, out[0])
127+
}
128+
{
129+
source := []string{newSource(5).(string)}
130+
out := TaintStepTest_SlicesConcat1(source)
131+
sink(5, out[0])
132+
}
133+
{
134+
source := []string{newSource(6).(string)}
135+
out := TaintStepTest_SlicesDelete(source)
136+
sink(6, out[0])
137+
}
138+
{
139+
source := []string{newSource(7).(string)}
140+
out := TaintStepTest_SlicesDeleteFunc(source)
141+
sink(7, out[0])
142+
}
143+
{
144+
source := []string{newSource(8).(string)}
145+
out := TaintStepTest_SlicesGrow(source)
146+
sink(8, out[0])
147+
}
148+
{
149+
source := []string{newSource(9).(string)}
150+
out := TaintStepTest_SlicesInsert0(source)
151+
sink(9, out[0])
152+
}
153+
{
154+
source := newSource(10).(string)
155+
out := TaintStepTest_SlicesInsert2(source)
156+
sink(10, out[0])
157+
}
158+
{
159+
source := []string{newSource(11).(string)}
160+
out := TaintStepTest_SlicesMax(source)
161+
sink(11, out)
162+
}
163+
{
164+
source := []string{newSource(12).(string)}
165+
out := TaintStepTest_SlicesMaxFunc(source)
166+
sink(12, out)
167+
}
168+
{
169+
source := []string{newSource(13).(string)}
170+
out := TaintStepTest_SlicesMin(source)
171+
sink(13, out)
172+
}
173+
{
174+
source := []string{newSource(14).(string)}
175+
out := TaintStepTest_SlicesMinFunc(source)
176+
sink(14, out)
177+
}
178+
{
179+
source := []string{newSource(15).(string)}
180+
out := TaintStepTest_SlicesRepeat(source)
181+
sink(15, out[0])
182+
}
183+
{
184+
source := []string{newSource(16).(string)}
185+
out := TaintStepTest_SlicesReplace0(source)
186+
sink(16, out[0])
187+
}
188+
{
189+
source := newSource(17).(string)
190+
out := TaintStepTest_SlicesReplace3(source)
191+
sink(17, out[0])
192+
}
193+
}

go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module example.com/m
22

3-
go 1.20
3+
go 1.23
44

55
require (
66
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# golang.org/x/net v0.0.0-20201010224723-4f7140c49acb
2-
## explicit
3-
golang.org/x/net
2+
## explicit; go 1.11
3+
golang.org/x/net/context

0 commit comments

Comments
 (0)