Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

incomplete array in struct alignment is wrong #1359

Closed
photoszzt opened this issue Aug 2, 2018 · 2 comments
Closed

incomplete array in struct alignment is wrong #1359

photoszzt opened this issue Aug 2, 2018 · 2 comments

Comments

@photoszzt
Copy link
Contributor

Input C/C++ Header

struct bpf_raw_tracepoint_args {                                                                                              
        unsigned long long args[0];                                                                                                        
};

Bindgen Invocation

$ bindgen input.h

Actual Results

---- bindgen_test_layout_bpf_raw_tracepoint_args stdout ----
thread 'bindgen_test_layout_bpf_raw_tracepoint_args' panicked at 'assertion failed: `(left == right)`
  left: `1`,
 right: `8`: Alignment of bpf_raw_tracepoint_args', src/main.rs:52:5
#[repr(C)]
#[derive(Default)]
pub struct __IncompleteArrayField<T>(::std::marker::PhantomData<T>);
impl<T> __IncompleteArrayField<T> {
    #[inline]
    pub fn new() -> Self {
        __IncompleteArrayField(::std::marker::PhantomData)
    }
    #[inline]
    pub unsafe fn as_ptr(&self) -> *const T {
        ::std::mem::transmute(self)
    }
    #[inline]
    pub unsafe fn as_mut_ptr(&mut self) -> *mut T {
        ::std::mem::transmute(self)
    }
    #[inline]
    pub unsafe fn as_slice(&self, len: usize) -> &[T] {
        ::std::slice::from_raw_parts(self.as_ptr(), len)
    }
    #[inline]
    pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] {
        ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len)
    }
}
impl<T> ::std::fmt::Debug for __IncompleteArrayField<T> {
    fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
        fmt.write_str("__IncompleteArrayField")
    }
}
impl<T> ::std::clone::Clone for __IncompleteArrayField<T> {
    #[inline]
    fn clone(&self) -> Self {
        Self::new()
    }
}
impl<T> ::std::marker::Copy for __IncompleteArrayField<T> {}
#[repr(C)]
#[derive(Debug)]
pub struct bpf_raw_tracepoint_args {
    pub args: __IncompleteArrayField<::std::os::raw::c_ulonglong>,
}
#[test]
fn bindgen_test_layout_bpf_raw_tracepoint_args() {
    assert_eq!(
        ::std::mem::size_of::<bpf_raw_tracepoint_args>(),
        0usize,
        concat!("Size of: ", stringify!(bpf_raw_tracepoint_args))
    );
    assert_eq!(
        ::std::mem::align_of::<bpf_raw_tracepoint_args>(),
        8usize,
        concat!("Alignment of ", stringify!(bpf_raw_tracepoint_args))
    );
    assert_eq!(
        unsafe { &(*(::std::ptr::null::<bpf_raw_tracepoint_args>())).args as *const _ as usize },
        0usize,
        concat!(
            "Offset of field: ",
            stringify!(bpf_raw_tracepoint_args),
            "::",
            stringify!(args)
        )
    );
}

Expected Results

The alignment should be 8, not 1.

@emilio
Copy link
Contributor

emilio commented Aug 5, 2018

Nice one :)

I think it should be easy to add a zero-size array to force pointer alignment like:

#[repr(C)]
#[derive(Default)]
pub struct __IncompleteArrayField<T> {
    _alignment: [*const (); 0],
    _marker: ::std::marker::PhantomData<T>,
}

Or something like that.

@emilio
Copy link
Contributor

emilio commented Aug 31, 2019

I think this was fixed by #1592, and a bit more generaly by repr(align) support.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants