Skip to content

Commit db3dfdc

Browse files
committed
Swift: Model Manual Memory Management closure functions.
1 parent 1de9919 commit db3dfdc

File tree

2 files changed

+32
-19
lines changed

2 files changed

+32
-19
lines changed

swift/ql/lib/codeql/swift/frameworks/StandardLibrary/PointerTypes.qll

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,19 @@ private class PointerSummaries extends SummaryModelCsv {
6868
[
6969
";UnsafeMutablePointer;true;init(mutating:);;;Argument[0];ReturnValue;taint",
7070
";UnsafeMutableBufferPointer;true;update(repeating:);;;Argument[0];Argument[-1].CollectionElement;value",
71+
";;false;withUnsafePointer(to:_:);;;Argument[0];Argument[1].Parameter[0].CollectionElement;taint",
72+
";;false;withUnsafePointer(to:_:);;;Argument[1].ReturnValue;ReturnValue;value",
73+
";;false;withUnsafeMutablePointer(to:_:);;;Argument[0];Argument[1].Parameter[0].CollectionElement;taint",
74+
";;false;withUnsafeMutablePointer(to:_:);;;Argument[1].Parameter[0].CollectionElement;Argument[0];value",
75+
";;false;withUnsafeMutablePointer(to:_:);;;Argument[1].ReturnValue;ReturnValue;value",
76+
";;false;withUnsafeBytes(of:_:);;;Argument[0];Argument[1].Parameter[0].CollectionElement;taint",
77+
";;false;withUnsafeBytes(of:_:);;;Argument[1].ReturnValue;ReturnValue;value",
78+
";;false;withUnsafeMutableBytes(of:_:);;;Argument[0];Argument[1].Parameter[0].CollectionElement;taint",
79+
";;false;withUnsafeMutableBytes(of:_:);;;Argument[1].Parameter[0].CollectionElement;Argument[0];taint",
80+
";;false;withUnsafeMutableBytes(of:_:);;;Argument[1].ReturnValue;ReturnValue;value",
81+
";;false;withUnsafeTemporaryAllocation(of:capacity:_:);;;Argument[2].ReturnValue;ReturnValue;value",
82+
";;false;withUnsafeTemporaryAllocation(byteCount:alignment:_:);;;Argument[2].ReturnValue;ReturnValue;value",
83+
";;false;withExtendedLifetime(_:_:);;;Argument[1].ReturnValue;ReturnValue;value",
7184
]
7285
}
7386
}

swift/ql/test/library-tests/dataflow/taint/libraries/unsafepointer.swift

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -135,33 +135,33 @@ func testManualMemoryManagement() {
135135
let i1 = sourceInt("i1")
136136
let r1 = withUnsafePointer(to: i1, {
137137
ptr in
138-
sink(arg: ptr)
139-
sink(arg: ptr[0]) // $ MISSING: tainted=i1
138+
sink(arg: ptr) // $ tainted=i1
139+
sink(arg: ptr[0]) // $ tainted=i1
140140
sink(arg: ptr.pointee) // $ MISSING: tainted=i1
141141
return sourceInt("r1")
142142
})
143-
sink(arg: r1) // $ MISSING: tainted=r1
143+
sink(arg: r1) // $ tainted=r1
144144

145145
var i2 = sourceInt("i2")
146146
let r2 = withUnsafeMutablePointer(to: &i2, {
147147
ptr in
148-
sink(arg: ptr)
149-
sink(arg: ptr[0]) // $ MISSING: tainted=i2
148+
sink(arg: ptr) // $ tainted=i2
149+
sink(arg: ptr[0]) // $ tainted=i2
150150
sink(arg: ptr.pointee) // $ MISSING: tainted=i2
151151
ptr.pointee = sourceInt("i2_overwrite")
152-
sink(arg: ptr)
153-
sink(arg: ptr[0]) // $ MISSING: tainted=i2_overwrite
152+
sink(arg: ptr) // $ SPURIOUS: tainted=i2
153+
sink(arg: ptr[0]) // $ MISSING: tainted=i2_overwrite SPURIOUS: tainted=i2
154154
sink(arg: ptr.pointee) // $ tainted=i2_overwrite
155155
return sourceInt("r2")
156156
})
157-
sink(arg: r2) // $ MISSING: tainted=r2
157+
sink(arg: r2) // $ tainted=r2
158158
sink(arg: i2) // $ MISSING: tainted=i2_overwrite SPURIOUS: tainted=i2
159159

160160
let i3 = sourceInt("i3")
161161
let r3 = withUnsafeBytes(of: i3, {
162162
ptr in
163-
sink(arg: ptr)
164-
sink(arg: ptr[0]) // $ MISSING: tainted=i3
163+
sink(arg: ptr) // $ tainted=i3
164+
sink(arg: ptr[0]) // $ tainted=i3
165165
ptr.withMemoryRebound(to: Int.self, {
166166
buffer in
167167
sink(arg: buffer)
@@ -172,20 +172,20 @@ func testManualMemoryManagement() {
172172
sink(arg: buffer2[0]) // $ MISSING: tainted=i3
173173
return sourceInt("r3")
174174
})
175-
sink(arg: r3) // $ MISSING: tainted=r3
175+
sink(arg: r3) // $ tainted=r3
176176

177177
var i4 = sourceInt("i4")
178178
let r4 = withUnsafeMutableBytes(of: &i4, {
179179
ptr in
180-
sink(arg: ptr)
181-
sink(arg: ptr[0]) // $ MISSING: tainted=i4
180+
sink(arg: ptr) // $ tainted=i4
181+
sink(arg: ptr[0]) // $ tainted=i4
182182
ptr[0] = sourceUInt8("i4_partialwrite")
183-
sink(arg: ptr) // $ tainted=i4_partialwrite MISSING: tainted=i4
184-
sink(arg: ptr[0]) // $ tainted=i4_partialwrite
183+
sink(arg: ptr) // $ tainted=i4_partialwrite tainted=i4
184+
sink(arg: ptr[0]) // $ tainted=i4_partialwrite SPURIOUS: tainted=i4
185185
return sourceInt("r4")
186186
})
187-
sink(arg: r4) // $ MISSING: tainted=r4
188-
sink(arg: i4) // $ tainted=i4 MISSING: tainted=i4_partialwrite
187+
sink(arg: r4) // $ tainted=r4
188+
sink(arg: i4) // $ tainted=i4 tainted=i4_partialwrite
189189

190190
let r5 = withUnsafeTemporaryAllocation(of: Int.self, capacity: 10, {
191191
buffer in
@@ -196,10 +196,10 @@ func testManualMemoryManagement() {
196196
sink(arg: buffer[0]) // $ tainted=buffer5
197197
return sourceInt("r5")
198198
})
199-
sink(arg: r5) // $ MISSING: tainted=r5
199+
sink(arg: r5) // $ tainted=r5
200200

201201
let r6 = withExtendedLifetime(sourceInt("i6"), {
202202
return sourceInt("r6")
203203
})
204-
sink(arg: r6) // $ MISSING: tainted=r6
204+
sink(arg: r6) // $ tainted=r6
205205
}

0 commit comments

Comments
 (0)