Skip to content

Make the Debug implementation for unions always opaque #4118

Closed
@tgross35

Description

@tgross35

We currently have a lot of unsafe reads of unions fields which is source of easy unsoundness. Let's make things easier while avoiding this completely:

  1. Change s_no_extra_traits to do an opaque Debug implementation on unions, here

    libc/src/macros.rs

    Lines 122 to 129 in 2f931d9

    (it: $(#[$attr:meta])* pub union $i:ident { $($field:tt)* }) => (
    __item! {
    #[repr(C)]
    #[derive(Copy, Clone)]
    $(#[$attr])*
    pub union $i { $($field)* }
    }
    );
  2. Delete all existing Debug implementations on unions (which will now conflict).

The implementation is easy, this will just print the types as some_union { .. }:

#[cfg(feature = "extra_traits")]
impl ::core::fmt::Debug for $i {
    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
        f.debug_struct(stringify!($i)).finish_non_exhaustive()
    }
}

We can backport this to libc-0.2 since it fixes some soundness issues without breaking any API.

Metadata

Metadata

Assignees

No one assigned

    Labels

    E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.E-help-wantedCall for participation: Help is requested to fix this issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions