Skip to content

Commit eac170a

Browse files
author
zzhu
committed
Fix incomplete array alignment in struct
1 parent d991134 commit eac170a

File tree

3 files changed

+92
-3
lines changed

3 files changed

+92
-3
lines changed

src/codegen/mod.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3658,17 +3658,23 @@ mod utils {
36583658
let incomplete_array_decl = quote! {
36593659
#[repr(C)]
36603660
#[derive(Default)]
3661-
pub struct __IncompleteArrayField<T>(
3662-
::#prefix::marker::PhantomData<T>);
3661+
pub struct __IncompleteArrayField<T>{
3662+
_alignment: [*const (); 0],
3663+
_marker: ::#prefix::marker::PhantomData<T>,
3664+
}
36633665
};
36643666

36653667
let incomplete_array_impl = quote! {
36663668
impl<T> __IncompleteArrayField<T> {
36673669
#[inline]
36683670
pub fn new() -> Self {
3669-
__IncompleteArrayField(::#prefix::marker::PhantomData)
3671+
__IncompleteArrayField {
3672+
_marker: ::#prefix::marker::PhantomData,
3673+
_alignment: Default::default(),
3674+
}
36703675
}
36713676

3677+
36723678
#[inline]
36733679
pub unsafe fn as_ptr(&self) -> *const T {
36743680
::#prefix::mem::transmute(self)
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/* automatically generated by rust-bindgen */
2+
3+
#![allow(
4+
dead_code,
5+
non_snake_case,
6+
non_camel_case_types,
7+
non_upper_case_globals
8+
)]
9+
10+
#[repr(C)]
11+
#[derive(Default)]
12+
pub struct __IncompleteArrayField<T> {
13+
_alignment: [*const (); 0],
14+
_marker: ::std::marker::PhantomData<T>,
15+
}
16+
impl<T> __IncompleteArrayField<T> {
17+
#[inline]
18+
pub fn new() -> Self {
19+
__IncompleteArrayField {
20+
_marker: ::std::marker::PhantomData,
21+
_alignment: Default::default(),
22+
}
23+
}
24+
#[inline]
25+
pub unsafe fn as_ptr(&self) -> *const T {
26+
::std::mem::transmute(self)
27+
}
28+
#[inline]
29+
pub unsafe fn as_mut_ptr(&mut self) -> *mut T {
30+
::std::mem::transmute(self)
31+
}
32+
#[inline]
33+
pub unsafe fn as_slice(&self, len: usize) -> &[T] {
34+
::std::slice::from_raw_parts(self.as_ptr(), len)
35+
}
36+
#[inline]
37+
pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] {
38+
::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len)
39+
}
40+
}
41+
impl<T> ::std::fmt::Debug for __IncompleteArrayField<T> {
42+
fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
43+
fmt.write_str("__IncompleteArrayField")
44+
}
45+
}
46+
impl<T> ::std::clone::Clone for __IncompleteArrayField<T> {
47+
#[inline]
48+
fn clone(&self) -> Self {
49+
Self::new()
50+
}
51+
}
52+
impl<T> ::std::marker::Copy for __IncompleteArrayField<T> {}
53+
#[repr(C)]
54+
#[derive(Debug, Default)]
55+
pub struct bpf_raw_tracepoint_args {
56+
pub args: __IncompleteArrayField<::std::os::raw::c_ulonglong>,
57+
}
58+
#[test]
59+
fn bindgen_test_layout_bpf_raw_tracepoint_args() {
60+
assert_eq!(
61+
::std::mem::size_of::<bpf_raw_tracepoint_args>(),
62+
0usize,
63+
concat!("Size of: ", stringify!(bpf_raw_tracepoint_args))
64+
);
65+
assert_eq!(
66+
::std::mem::align_of::<bpf_raw_tracepoint_args>(),
67+
8usize,
68+
concat!("Alignment of ", stringify!(bpf_raw_tracepoint_args))
69+
);
70+
assert_eq!(
71+
unsafe { &(*(::std::ptr::null::<bpf_raw_tracepoint_args>())).args as *const _ as usize },
72+
0usize,
73+
concat!(
74+
"Offset of field: ",
75+
stringify!(bpf_raw_tracepoint_args),
76+
"::",
77+
stringify!(args)
78+
)
79+
);
80+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
struct bpf_raw_tracepoint_args {
2+
unsigned long long args[0];
3+
};

0 commit comments

Comments
 (0)