Skip to content

Commit e5b7be9

Browse files
committed
Add asserts to all the repeated/packed visitors.
The generated code should never visit an empty repeated field, so this just ensures in debug builds that that never happens and serves to document that it won't happen.
1 parent 82baa8a commit e5b7be9

File tree

6 files changed

+96
-0
lines changed

6 files changed

+96
-0
lines changed

Sources/SwiftProtobuf/BinaryEncodingSizeVisitor.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,18 +105,21 @@ internal struct BinaryEncodingSizeVisitor: Visitor {
105105
}
106106

107107
mutating func visitPackedFloatField(value: [Float], fieldNumber: Int) throws {
108+
assert(!value.isEmpty)
108109
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
109110
let dataSize = value.count * MemoryLayout<Float>.size
110111
serializedSize += tagSize + Varint.encodedSize(of: Int64(dataSize)) + dataSize
111112
}
112113

113114
mutating func visitPackedDoubleField(value: [Double], fieldNumber: Int) throws {
115+
assert(!value.isEmpty)
114116
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
115117
let dataSize = value.count * MemoryLayout<Double>.size
116118
serializedSize += tagSize + Varint.encodedSize(of: Int64(dataSize)) + dataSize
117119
}
118120

119121
mutating func visitPackedInt32Field(value: [Int32], fieldNumber: Int) throws {
122+
assert(!value.isEmpty)
120123
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
121124
var dataSize = 0
122125
for v in value {
@@ -127,6 +130,7 @@ internal struct BinaryEncodingSizeVisitor: Visitor {
127130
}
128131

129132
mutating func visitPackedInt64Field(value: [Int64], fieldNumber: Int) throws {
133+
assert(!value.isEmpty)
130134
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
131135
var dataSize = 0
132136
for v in value {
@@ -137,6 +141,7 @@ internal struct BinaryEncodingSizeVisitor: Visitor {
137141
}
138142

139143
mutating func visitPackedSInt32Field(value: [Int32], fieldNumber: Int) throws {
144+
assert(!value.isEmpty)
140145
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
141146
var dataSize = 0
142147
for v in value {
@@ -147,6 +152,7 @@ internal struct BinaryEncodingSizeVisitor: Visitor {
147152
}
148153

149154
mutating func visitPackedSInt64Field(value: [Int64], fieldNumber: Int) throws {
155+
assert(!value.isEmpty)
150156
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
151157
var dataSize = 0
152158
for v in value {
@@ -157,6 +163,7 @@ internal struct BinaryEncodingSizeVisitor: Visitor {
157163
}
158164

159165
mutating func visitPackedUInt32Field(value: [UInt32], fieldNumber: Int) throws {
166+
assert(!value.isEmpty)
160167
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
161168
var dataSize = 0
162169
for v in value {
@@ -167,6 +174,7 @@ internal struct BinaryEncodingSizeVisitor: Visitor {
167174
}
168175

169176
mutating func visitPackedUInt64Field(value: [UInt64], fieldNumber: Int) throws {
177+
assert(!value.isEmpty)
170178
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
171179
var dataSize = 0
172180
for v in value {
@@ -177,30 +185,35 @@ internal struct BinaryEncodingSizeVisitor: Visitor {
177185
}
178186

179187
mutating func visitPackedFixed32Field(value: [UInt32], fieldNumber: Int) throws {
188+
assert(!value.isEmpty)
180189
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
181190
let dataSize = value.count * MemoryLayout<UInt32>.size
182191
serializedSize += tagSize + Varint.encodedSize(of: Int64(dataSize)) + dataSize
183192
}
184193

185194
mutating func visitPackedFixed64Field(value: [UInt64], fieldNumber: Int) throws {
195+
assert(!value.isEmpty)
186196
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
187197
let dataSize = value.count * MemoryLayout<UInt64>.size
188198
serializedSize += tagSize + Varint.encodedSize(of: Int64(dataSize)) + dataSize
189199
}
190200

191201
mutating func visitPackedSFixed32Field(value: [Int32], fieldNumber: Int) throws {
202+
assert(!value.isEmpty)
192203
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
193204
let dataSize = value.count * MemoryLayout<Int32>.size
194205
serializedSize += tagSize + Varint.encodedSize(of: Int64(dataSize)) + dataSize
195206
}
196207

197208
mutating func visitPackedSFixed64Field(value: [Int64], fieldNumber: Int) throws {
209+
assert(!value.isEmpty)
198210
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
199211
let dataSize = value.count * MemoryLayout<Int64>.size
200212
serializedSize += tagSize + Varint.encodedSize(of: Int64(dataSize)) + dataSize
201213
}
202214

203215
mutating func visitPackedBoolField(value: [Bool], fieldNumber: Int) throws {
216+
assert(!value.isEmpty)
204217
let tagSize = FieldTag(fieldNumber: fieldNumber, wireFormat: .lengthDelimited).encodedSize
205218
let dataSize = value.count
206219
serializedSize += tagSize + Varint.encodedSize(of: Int64(dataSize)) + dataSize
@@ -217,6 +230,7 @@ internal struct BinaryEncodingSizeVisitor: Visitor {
217230

218231
mutating func visitRepeatedEnumField<E: Enum>(value: [E],
219232
fieldNumber: Int) throws {
233+
assert(!value.isEmpty)
220234
let tagSize = FieldTag(fieldNumber: fieldNumber,
221235
wireFormat: .varint).encodedSize
222236
serializedSize += value.count * tagSize
@@ -228,6 +242,7 @@ internal struct BinaryEncodingSizeVisitor: Visitor {
228242

229243
mutating func visitPackedEnumField<E: Enum>(value: [E],
230244
fieldNumber: Int) throws {
245+
assert(!value.isEmpty)
231246
let tagSize = FieldTag(fieldNumber: fieldNumber,
232247
wireFormat: .varint).encodedSize
233248
serializedSize += tagSize
@@ -249,6 +264,7 @@ internal struct BinaryEncodingSizeVisitor: Visitor {
249264

250265
mutating func visitRepeatedMessageField<M: Message>(value: [M],
251266
fieldNumber: Int) throws {
267+
assert(!value.isEmpty)
252268
let tagSize = FieldTag(fieldNumber: fieldNumber,
253269
wireFormat: .lengthDelimited).encodedSize
254270
serializedSize += value.count * tagSize
@@ -270,6 +286,7 @@ internal struct BinaryEncodingSizeVisitor: Visitor {
270286

271287
mutating func visitRepeatedGroupField<G: Message>(value: [G],
272288
fieldNumber: Int) throws {
289+
assert(!value.isEmpty)
273290
let tagSize = FieldTag(fieldNumber: fieldNumber,
274291
wireFormat: .startGroup).encodedSize
275292
serializedSize += 2 * value.count * tagSize

Sources/SwiftProtobuf/BinaryEncodingVisitor.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ internal struct BinaryEncodingVisitor: Visitor {
123123
// Packed Fields
124124

125125
mutating func visitPackedFloatField(value: [Float], fieldNumber: Int) throws {
126+
assert(!value.isEmpty)
126127
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
127128
encoder.putVarInt(value: value.count * MemoryLayout<Float>.size)
128129
for v in value {
@@ -131,6 +132,7 @@ internal struct BinaryEncodingVisitor: Visitor {
131132
}
132133

133134
mutating func visitPackedDoubleField(value: [Double], fieldNumber: Int) throws {
135+
assert(!value.isEmpty)
134136
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
135137
encoder.putVarInt(value: value.count * MemoryLayout<Double>.size)
136138
for v in value {
@@ -139,6 +141,7 @@ internal struct BinaryEncodingVisitor: Visitor {
139141
}
140142

141143
mutating func visitPackedInt32Field(value: [Int32], fieldNumber: Int) throws {
144+
assert(!value.isEmpty)
142145
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
143146
var packedSize = 0
144147
for v in value {
@@ -151,6 +154,7 @@ internal struct BinaryEncodingVisitor: Visitor {
151154
}
152155

153156
mutating func visitPackedInt64Field(value: [Int64], fieldNumber: Int) throws {
157+
assert(!value.isEmpty)
154158
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
155159
var packedSize = 0
156160
for v in value {
@@ -163,6 +167,7 @@ internal struct BinaryEncodingVisitor: Visitor {
163167
}
164168

165169
mutating func visitPackedSInt32Field(value: [Int32], fieldNumber: Int) throws {
170+
assert(!value.isEmpty)
166171
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
167172
var packedSize = 0
168173
for v in value {
@@ -175,6 +180,7 @@ internal struct BinaryEncodingVisitor: Visitor {
175180
}
176181

177182
mutating func visitPackedSInt64Field(value: [Int64], fieldNumber: Int) throws {
183+
assert(!value.isEmpty)
178184
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
179185
var packedSize = 0
180186
for v in value {
@@ -187,6 +193,7 @@ internal struct BinaryEncodingVisitor: Visitor {
187193
}
188194

189195
mutating func visitPackedUInt32Field(value: [UInt32], fieldNumber: Int) throws {
196+
assert(!value.isEmpty)
190197
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
191198
var packedSize = 0
192199
for v in value {
@@ -199,6 +206,7 @@ internal struct BinaryEncodingVisitor: Visitor {
199206
}
200207

201208
mutating func visitPackedUInt64Field(value: [UInt64], fieldNumber: Int) throws {
209+
assert(!value.isEmpty)
202210
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
203211
var packedSize = 0
204212
for v in value {
@@ -211,6 +219,7 @@ internal struct BinaryEncodingVisitor: Visitor {
211219
}
212220

213221
mutating func visitPackedFixed32Field(value: [UInt32], fieldNumber: Int) throws {
222+
assert(!value.isEmpty)
214223
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
215224
encoder.putVarInt(value: value.count * MemoryLayout<UInt32>.size)
216225
for v in value {
@@ -219,6 +228,7 @@ internal struct BinaryEncodingVisitor: Visitor {
219228
}
220229

221230
mutating func visitPackedFixed64Field(value: [UInt64], fieldNumber: Int) throws {
231+
assert(!value.isEmpty)
222232
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
223233
encoder.putVarInt(value: value.count * MemoryLayout<UInt64>.size)
224234
for v in value {
@@ -227,6 +237,7 @@ internal struct BinaryEncodingVisitor: Visitor {
227237
}
228238

229239
mutating func visitPackedSFixed32Field(value: [Int32], fieldNumber: Int) throws {
240+
assert(!value.isEmpty)
230241
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
231242
encoder.putVarInt(value: value.count * MemoryLayout<Int32>.size)
232243
for v in value {
@@ -235,6 +246,7 @@ internal struct BinaryEncodingVisitor: Visitor {
235246
}
236247

237248
mutating func visitPackedSFixed64Field(value: [Int64], fieldNumber: Int) throws {
249+
assert(!value.isEmpty)
238250
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
239251
encoder.putVarInt(value: value.count * MemoryLayout<Int64>.size)
240252
for v in value {
@@ -243,6 +255,7 @@ internal struct BinaryEncodingVisitor: Visitor {
243255
}
244256

245257
mutating func visitPackedBoolField(value: [Bool], fieldNumber: Int) throws {
258+
assert(!value.isEmpty)
246259
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
247260
encoder.putVarInt(value: value.count)
248261
for v in value {
@@ -251,6 +264,7 @@ internal struct BinaryEncodingVisitor: Visitor {
251264
}
252265

253266
mutating func visitPackedEnumField<E: Enum>(value: [E], fieldNumber: Int) throws {
267+
assert(!value.isEmpty)
254268
encoder.startField(fieldNumber: fieldNumber, wireFormat: .lengthDelimited)
255269
var packedSize = 0
256270
for v in value {

Sources/SwiftProtobuf/HashVisitor.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ internal struct HashVisitor: Visitor {
145145
}
146146

147147
mutating func visitRepeatedFloatField(value: [Float], fieldNumber: Int) throws {
148+
assert(!value.isEmpty)
148149
#if swift(>=4.2)
149150
hasher.combine(fieldNumber)
150151
hasher.combine(value)
@@ -157,6 +158,7 @@ internal struct HashVisitor: Visitor {
157158
}
158159

159160
mutating func visitRepeatedDoubleField(value: [Double], fieldNumber: Int) throws {
161+
assert(!value.isEmpty)
160162
#if swift(>=4.2)
161163
hasher.combine(fieldNumber)
162164
hasher.combine(value)
@@ -169,6 +171,7 @@ internal struct HashVisitor: Visitor {
169171
}
170172

171173
mutating func visitRepeatedInt32Field(value: [Int32], fieldNumber: Int) throws {
174+
assert(!value.isEmpty)
172175
#if swift(>=4.2)
173176
hasher.combine(fieldNumber)
174177
hasher.combine(value)
@@ -181,6 +184,7 @@ internal struct HashVisitor: Visitor {
181184
}
182185

183186
mutating func visitRepeatedInt64Field(value: [Int64], fieldNumber: Int) throws {
187+
assert(!value.isEmpty)
184188
#if swift(>=4.2)
185189
hasher.combine(fieldNumber)
186190
hasher.combine(value)
@@ -193,6 +197,7 @@ internal struct HashVisitor: Visitor {
193197
}
194198

195199
mutating func visitRepeatedUInt32Field(value: [UInt32], fieldNumber: Int) throws {
200+
assert(!value.isEmpty)
196201
#if swift(>=4.2)
197202
hasher.combine(fieldNumber)
198203
hasher.combine(value)
@@ -205,6 +210,7 @@ internal struct HashVisitor: Visitor {
205210
}
206211

207212
mutating func visitRepeatedUInt64Field(value: [UInt64], fieldNumber: Int) throws {
213+
assert(!value.isEmpty)
208214
#if swift(>=4.2)
209215
hasher.combine(fieldNumber)
210216
hasher.combine(value)
@@ -217,6 +223,7 @@ internal struct HashVisitor: Visitor {
217223
}
218224

219225
mutating func visitRepeatedSInt32Field(value: [Int32], fieldNumber: Int) throws {
226+
assert(!value.isEmpty)
220227
#if swift(>=4.2)
221228
hasher.combine(fieldNumber)
222229
hasher.combine(value)
@@ -229,6 +236,7 @@ internal struct HashVisitor: Visitor {
229236
}
230237

231238
mutating func visitRepeatedSInt64Field(value: [Int64], fieldNumber: Int) throws {
239+
assert(!value.isEmpty)
232240
#if swift(>=4.2)
233241
hasher.combine(fieldNumber)
234242
hasher.combine(value)
@@ -241,6 +249,7 @@ internal struct HashVisitor: Visitor {
241249
}
242250

243251
mutating func visitRepeatedFixed32Field(value: [UInt32], fieldNumber: Int) throws {
252+
assert(!value.isEmpty)
244253
#if swift(>=4.2)
245254
hasher.combine(fieldNumber)
246255
hasher.combine(value)
@@ -253,6 +262,7 @@ internal struct HashVisitor: Visitor {
253262
}
254263

255264
mutating func visitRepeatedFixed64Field(value: [UInt64], fieldNumber: Int) throws {
265+
assert(!value.isEmpty)
256266
#if swift(>=4.2)
257267
hasher.combine(fieldNumber)
258268
hasher.combine(value)
@@ -265,6 +275,7 @@ internal struct HashVisitor: Visitor {
265275
}
266276

267277
mutating func visitRepeatedSFixed32Field(value: [Int32], fieldNumber: Int) throws {
278+
assert(!value.isEmpty)
268279
#if swift(>=4.2)
269280
hasher.combine(fieldNumber)
270281
hasher.combine(value)
@@ -277,6 +288,7 @@ internal struct HashVisitor: Visitor {
277288
}
278289

279290
mutating func visitRepeatedSFixed64Field(value: [Int64], fieldNumber: Int) throws {
291+
assert(!value.isEmpty)
280292
#if swift(>=4.2)
281293
hasher.combine(fieldNumber)
282294
hasher.combine(value)
@@ -289,6 +301,7 @@ internal struct HashVisitor: Visitor {
289301
}
290302

291303
mutating func visitRepeatedBoolField(value: [Bool], fieldNumber: Int) throws {
304+
assert(!value.isEmpty)
292305
#if swift(>=4.2)
293306
hasher.combine(fieldNumber)
294307
hasher.combine(value)
@@ -301,6 +314,7 @@ internal struct HashVisitor: Visitor {
301314
}
302315

303316
mutating func visitRepeatedStringField(value: [String], fieldNumber: Int) throws {
317+
assert(!value.isEmpty)
304318
#if swift(>=4.2)
305319
hasher.combine(fieldNumber)
306320
hasher.combine(value)
@@ -313,6 +327,7 @@ internal struct HashVisitor: Visitor {
313327
}
314328

315329
mutating func visitRepeatedBytesField(value: [Data], fieldNumber: Int) throws {
330+
assert(!value.isEmpty)
316331
#if swift(>=4.2)
317332
hasher.combine(fieldNumber)
318333
hasher.combine(value)
@@ -325,6 +340,7 @@ internal struct HashVisitor: Visitor {
325340
}
326341

327342
mutating func visitRepeatedEnumField<E: Enum>(value: [E], fieldNumber: Int) throws {
343+
assert(!value.isEmpty)
328344
#if swift(>=4.2)
329345
hasher.combine(fieldNumber)
330346
hasher.combine(value)
@@ -337,6 +353,7 @@ internal struct HashVisitor: Visitor {
337353
}
338354

339355
mutating func visitRepeatedMessageField<M: Message>(value: [M], fieldNumber: Int) throws {
356+
assert(!value.isEmpty)
340357
#if swift(>=4.2)
341358
hasher.combine(fieldNumber)
342359
for v in value {
@@ -351,6 +368,7 @@ internal struct HashVisitor: Visitor {
351368
}
352369

353370
mutating func visitRepeatedGroupField<G: Message>(value: [G], fieldNumber: Int) throws {
371+
assert(!value.isEmpty)
354372
#if swift(>=4.2)
355373
hasher.combine(fieldNumber)
356374
for v in value {

0 commit comments

Comments
 (0)