Skip to content

Commit f059ede

Browse files
author
bors-servo
authored
Auto merge of rust-lang#1137 - fitzgen:divide-by-zero-in-struct-layout, r=emilio
Divide by zero in struct layout See commit messages for details. r? @emilio or @pepyakin
2 parents 0e84605 + 460aaa0 commit f059ede

File tree

192 files changed

+1092
-1289
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

192 files changed

+1092
-1289
lines changed

src/codegen/mod.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -1787,9 +1787,13 @@ impl CodeGenerator for CompInfo {
17871787
let field_name = ctx.rust_ident(name);
17881788

17891789
Some(quote! {
1790-
assert_eq!(unsafe { &(*(0 as *const #canonical_ident)).#field_name as *const _ as usize },
1791-
#field_offset,
1792-
concat!("Alignment of field: ", stringify!(#canonical_ident), "::", stringify!(#field_name)));
1790+
assert_eq!(
1791+
unsafe {
1792+
&(*(0 as *const #canonical_ident)).#field_name as *const _ as usize
1793+
},
1794+
#field_offset,
1795+
concat!("Offset of field: ", stringify!(#canonical_ident), "::", stringify!(#field_name))
1796+
);
17931797
})
17941798
})
17951799
})

src/codegen/struct_layout.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,12 @@ impl<'a> StructLayoutTracker<'a> {
335335
new_field_layout
336336
);
337337

338+
// Avoid divide-by-zero errors if align is 0.
339+
let align = cmp::max(1, layout.align);
340+
338341
if self.last_field_was_bitfield &&
339-
new_field_layout.align <= layout.size % layout.align &&
340-
new_field_layout.size <= layout.size % layout.align
342+
new_field_layout.align <= layout.size % align &&
343+
new_field_layout.size <= layout.size % align
341344
{
342345
// The new field will be coalesced into some of the remaining bits.
343346
//

tests/expectations/tests/16-byte-alignment.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1() {
4848
},
4949
0usize,
5050
concat!(
51-
"Alignment of field: ",
51+
"Offset of field: ",
5252
stringify!(rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1),
5353
"::",
5454
stringify!(dport)
@@ -60,7 +60,7 @@ fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1() {
6060
},
6161
2usize,
6262
concat!(
63-
"Alignment of field: ",
63+
"Offset of field: ",
6464
stringify!(rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1),
6565
"::",
6666
stringify!(sport)
@@ -83,7 +83,7 @@ fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1() {
8383
unsafe { &(*(0 as *const rte_ipv4_tuple__bindgen_ty_1)).sctp_tag as *const _ as usize },
8484
0usize,
8585
concat!(
86-
"Alignment of field: ",
86+
"Offset of field: ",
8787
stringify!(rte_ipv4_tuple__bindgen_ty_1),
8888
"::",
8989
stringify!(sctp_tag)
@@ -111,7 +111,7 @@ fn bindgen_test_layout_rte_ipv4_tuple() {
111111
unsafe { &(*(0 as *const rte_ipv4_tuple)).src_addr as *const _ as usize },
112112
0usize,
113113
concat!(
114-
"Alignment of field: ",
114+
"Offset of field: ",
115115
stringify!(rte_ipv4_tuple),
116116
"::",
117117
stringify!(src_addr)
@@ -121,7 +121,7 @@ fn bindgen_test_layout_rte_ipv4_tuple() {
121121
unsafe { &(*(0 as *const rte_ipv4_tuple)).dst_addr as *const _ as usize },
122122
4usize,
123123
concat!(
124-
"Alignment of field: ",
124+
"Offset of field: ",
125125
stringify!(rte_ipv4_tuple),
126126
"::",
127127
stringify!(dst_addr)
@@ -177,7 +177,7 @@ fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1() {
177177
},
178178
0usize,
179179
concat!(
180-
"Alignment of field: ",
180+
"Offset of field: ",
181181
stringify!(rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1),
182182
"::",
183183
stringify!(dport)
@@ -189,7 +189,7 @@ fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1() {
189189
},
190190
2usize,
191191
concat!(
192-
"Alignment of field: ",
192+
"Offset of field: ",
193193
stringify!(rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1),
194194
"::",
195195
stringify!(sport)
@@ -212,7 +212,7 @@ fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1() {
212212
unsafe { &(*(0 as *const rte_ipv6_tuple__bindgen_ty_1)).sctp_tag as *const _ as usize },
213213
0usize,
214214
concat!(
215-
"Alignment of field: ",
215+
"Offset of field: ",
216216
stringify!(rte_ipv6_tuple__bindgen_ty_1),
217217
"::",
218218
stringify!(sctp_tag)
@@ -240,7 +240,7 @@ fn bindgen_test_layout_rte_ipv6_tuple() {
240240
unsafe { &(*(0 as *const rte_ipv6_tuple)).src_addr as *const _ as usize },
241241
0usize,
242242
concat!(
243-
"Alignment of field: ",
243+
"Offset of field: ",
244244
stringify!(rte_ipv6_tuple),
245245
"::",
246246
stringify!(src_addr)
@@ -250,7 +250,7 @@ fn bindgen_test_layout_rte_ipv6_tuple() {
250250
unsafe { &(*(0 as *const rte_ipv6_tuple)).dst_addr as *const _ as usize },
251251
16usize,
252252
concat!(
253-
"Alignment of field: ",
253+
"Offset of field: ",
254254
stringify!(rte_ipv6_tuple),
255255
"::",
256256
stringify!(dst_addr)
@@ -280,7 +280,7 @@ fn bindgen_test_layout_rte_thash_tuple() {
280280
unsafe { &(*(0 as *const rte_thash_tuple)).v4 as *const _ as usize },
281281
0usize,
282282
concat!(
283-
"Alignment of field: ",
283+
"Offset of field: ",
284284
stringify!(rte_thash_tuple),
285285
"::",
286286
stringify!(v4)
@@ -290,7 +290,7 @@ fn bindgen_test_layout_rte_thash_tuple() {
290290
unsafe { &(*(0 as *const rte_thash_tuple)).v6 as *const _ as usize },
291291
0usize,
292292
concat!(
293-
"Alignment of field: ",
293+
"Offset of field: ",
294294
stringify!(rte_thash_tuple),
295295
"::",
296296
stringify!(v6)

tests/expectations/tests/16-byte-alignment_1_0.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1() {
9191
},
9292
0usize,
9393
concat!(
94-
"Alignment of field: ",
94+
"Offset of field: ",
9595
stringify!(rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1),
9696
"::",
9797
stringify!(dport)
@@ -103,7 +103,7 @@ fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1() {
103103
},
104104
2usize,
105105
concat!(
106-
"Alignment of field: ",
106+
"Offset of field: ",
107107
stringify!(rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1),
108108
"::",
109109
stringify!(sport)
@@ -131,7 +131,7 @@ fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1() {
131131
unsafe { &(*(0 as *const rte_ipv4_tuple__bindgen_ty_1)).sctp_tag as *const _ as usize },
132132
0usize,
133133
concat!(
134-
"Alignment of field: ",
134+
"Offset of field: ",
135135
stringify!(rte_ipv4_tuple__bindgen_ty_1),
136136
"::",
137137
stringify!(sctp_tag)
@@ -159,7 +159,7 @@ fn bindgen_test_layout_rte_ipv4_tuple() {
159159
unsafe { &(*(0 as *const rte_ipv4_tuple)).src_addr as *const _ as usize },
160160
0usize,
161161
concat!(
162-
"Alignment of field: ",
162+
"Offset of field: ",
163163
stringify!(rte_ipv4_tuple),
164164
"::",
165165
stringify!(src_addr)
@@ -169,7 +169,7 @@ fn bindgen_test_layout_rte_ipv4_tuple() {
169169
unsafe { &(*(0 as *const rte_ipv4_tuple)).dst_addr as *const _ as usize },
170170
4usize,
171171
concat!(
172-
"Alignment of field: ",
172+
"Offset of field: ",
173173
stringify!(rte_ipv4_tuple),
174174
"::",
175175
stringify!(dst_addr)
@@ -225,7 +225,7 @@ fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1() {
225225
},
226226
0usize,
227227
concat!(
228-
"Alignment of field: ",
228+
"Offset of field: ",
229229
stringify!(rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1),
230230
"::",
231231
stringify!(dport)
@@ -237,7 +237,7 @@ fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1() {
237237
},
238238
2usize,
239239
concat!(
240-
"Alignment of field: ",
240+
"Offset of field: ",
241241
stringify!(rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1),
242242
"::",
243243
stringify!(sport)
@@ -265,7 +265,7 @@ fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1() {
265265
unsafe { &(*(0 as *const rte_ipv6_tuple__bindgen_ty_1)).sctp_tag as *const _ as usize },
266266
0usize,
267267
concat!(
268-
"Alignment of field: ",
268+
"Offset of field: ",
269269
stringify!(rte_ipv6_tuple__bindgen_ty_1),
270270
"::",
271271
stringify!(sctp_tag)
@@ -293,7 +293,7 @@ fn bindgen_test_layout_rte_ipv6_tuple() {
293293
unsafe { &(*(0 as *const rte_ipv6_tuple)).src_addr as *const _ as usize },
294294
0usize,
295295
concat!(
296-
"Alignment of field: ",
296+
"Offset of field: ",
297297
stringify!(rte_ipv6_tuple),
298298
"::",
299299
stringify!(src_addr)
@@ -303,7 +303,7 @@ fn bindgen_test_layout_rte_ipv6_tuple() {
303303
unsafe { &(*(0 as *const rte_ipv6_tuple)).dst_addr as *const _ as usize },
304304
16usize,
305305
concat!(
306-
"Alignment of field: ",
306+
"Offset of field: ",
307307
stringify!(rte_ipv6_tuple),
308308
"::",
309309
stringify!(dst_addr)
@@ -333,7 +333,7 @@ fn bindgen_test_layout_rte_thash_tuple() {
333333
unsafe { &(*(0 as *const rte_thash_tuple)).v4 as *const _ as usize },
334334
0usize,
335335
concat!(
336-
"Alignment of field: ",
336+
"Offset of field: ",
337337
stringify!(rte_thash_tuple),
338338
"::",
339339
stringify!(v4)
@@ -343,7 +343,7 @@ fn bindgen_test_layout_rte_thash_tuple() {
343343
unsafe { &(*(0 as *const rte_thash_tuple)).v6 as *const _ as usize },
344344
0usize,
345345
concat!(
346-
"Alignment of field: ",
346+
"Offset of field: ",
347347
stringify!(rte_thash_tuple),
348348
"::",
349349
stringify!(v6)

tests/expectations/tests/accessors.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ fn bindgen_test_layout_SomeAccessors() {
3131
unsafe { &(*(0 as *const SomeAccessors)).mNoAccessor as *const _ as usize },
3232
0usize,
3333
concat!(
34-
"Alignment of field: ",
34+
"Offset of field: ",
3535
stringify!(SomeAccessors),
3636
"::",
3737
stringify!(mNoAccessor)
@@ -41,7 +41,7 @@ fn bindgen_test_layout_SomeAccessors() {
4141
unsafe { &(*(0 as *const SomeAccessors)).mBothAccessors as *const _ as usize },
4242
4usize,
4343
concat!(
44-
"Alignment of field: ",
44+
"Offset of field: ",
4545
stringify!(SomeAccessors),
4646
"::",
4747
stringify!(mBothAccessors)
@@ -51,7 +51,7 @@ fn bindgen_test_layout_SomeAccessors() {
5151
unsafe { &(*(0 as *const SomeAccessors)).mUnsafeAccessors as *const _ as usize },
5252
8usize,
5353
concat!(
54-
"Alignment of field: ",
54+
"Offset of field: ",
5555
stringify!(SomeAccessors),
5656
"::",
5757
stringify!(mUnsafeAccessors)
@@ -61,7 +61,7 @@ fn bindgen_test_layout_SomeAccessors() {
6161
unsafe { &(*(0 as *const SomeAccessors)).mImmutableAccessor as *const _ as usize },
6262
12usize,
6363
concat!(
64-
"Alignment of field: ",
64+
"Offset of field: ",
6565
stringify!(SomeAccessors),
6666
"::",
6767
stringify!(mImmutableAccessor)
@@ -113,7 +113,7 @@ fn bindgen_test_layout_AllAccessors() {
113113
unsafe { &(*(0 as *const AllAccessors)).mBothAccessors as *const _ as usize },
114114
0usize,
115115
concat!(
116-
"Alignment of field: ",
116+
"Offset of field: ",
117117
stringify!(AllAccessors),
118118
"::",
119119
stringify!(mBothAccessors)
@@ -123,7 +123,7 @@ fn bindgen_test_layout_AllAccessors() {
123123
unsafe { &(*(0 as *const AllAccessors)).mAlsoBothAccessors as *const _ as usize },
124124
4usize,
125125
concat!(
126-
"Alignment of field: ",
126+
"Offset of field: ",
127127
stringify!(AllAccessors),
128128
"::",
129129
stringify!(mAlsoBothAccessors)
@@ -171,7 +171,7 @@ fn bindgen_test_layout_AllUnsafeAccessors() {
171171
unsafe { &(*(0 as *const AllUnsafeAccessors)).mBothAccessors as *const _ as usize },
172172
0usize,
173173
concat!(
174-
"Alignment of field: ",
174+
"Offset of field: ",
175175
stringify!(AllUnsafeAccessors),
176176
"::",
177177
stringify!(mBothAccessors)
@@ -181,7 +181,7 @@ fn bindgen_test_layout_AllUnsafeAccessors() {
181181
unsafe { &(*(0 as *const AllUnsafeAccessors)).mAlsoBothAccessors as *const _ as usize },
182182
4usize,
183183
concat!(
184-
"Alignment of field: ",
184+
"Offset of field: ",
185185
stringify!(AllUnsafeAccessors),
186186
"::",
187187
stringify!(mAlsoBothAccessors)
@@ -234,7 +234,7 @@ fn bindgen_test_layout_ContradictAccessors() {
234234
unsafe { &(*(0 as *const ContradictAccessors)).mBothAccessors as *const _ as usize },
235235
0usize,
236236
concat!(
237-
"Alignment of field: ",
237+
"Offset of field: ",
238238
stringify!(ContradictAccessors),
239239
"::",
240240
stringify!(mBothAccessors)
@@ -244,7 +244,7 @@ fn bindgen_test_layout_ContradictAccessors() {
244244
unsafe { &(*(0 as *const ContradictAccessors)).mNoAccessors as *const _ as usize },
245245
4usize,
246246
concat!(
247-
"Alignment of field: ",
247+
"Offset of field: ",
248248
stringify!(ContradictAccessors),
249249
"::",
250250
stringify!(mNoAccessors)
@@ -254,7 +254,7 @@ fn bindgen_test_layout_ContradictAccessors() {
254254
unsafe { &(*(0 as *const ContradictAccessors)).mUnsafeAccessors as *const _ as usize },
255255
8usize,
256256
concat!(
257-
"Alignment of field: ",
257+
"Offset of field: ",
258258
stringify!(ContradictAccessors),
259259
"::",
260260
stringify!(mUnsafeAccessors)
@@ -264,7 +264,7 @@ fn bindgen_test_layout_ContradictAccessors() {
264264
unsafe { &(*(0 as *const ContradictAccessors)).mImmutableAccessor as *const _ as usize },
265265
12usize,
266266
concat!(
267-
"Alignment of field: ",
267+
"Offset of field: ",
268268
stringify!(ContradictAccessors),
269269
"::",
270270
stringify!(mImmutableAccessor)
@@ -315,7 +315,7 @@ fn bindgen_test_layout_Replaced() {
315315
unsafe { &(*(0 as *const Replaced)).mAccessor as *const _ as usize },
316316
0usize,
317317
concat!(
318-
"Alignment of field: ",
318+
"Offset of field: ",
319319
stringify!(Replaced),
320320
"::",
321321
stringify!(mAccessor)
@@ -354,7 +354,7 @@ fn bindgen_test_layout_Wrapper() {
354354
unsafe { &(*(0 as *const Wrapper)).mReplaced as *const _ as usize },
355355
0usize,
356356
concat!(
357-
"Alignment of field: ",
357+
"Offset of field: ",
358358
stringify!(Wrapper),
359359
"::",
360360
stringify!(mReplaced)

tests/expectations/tests/annotation_hide.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ fn bindgen_test_layout_NotAnnotated() {
4545
unsafe { &(*(0 as *const NotAnnotated)).f as *const _ as usize },
4646
0usize,
4747
concat!(
48-
"Alignment of field: ",
48+
"Offset of field: ",
4949
stringify!(NotAnnotated),
5050
"::",
5151
stringify!(f)

0 commit comments

Comments
 (0)