最近(いつから?)の bindgen でこんなコードが出力されていた。
#[repr(C)]
struct Foo {
bar: u8,
hoge: u32,
piyo: u8,
}
const _: () = {
use std::mem::offset_of;
["Foo size"][size_of::<Foo> - 12];
["Foo::bar"][offset_of!(Foo, bar) - 0];
["Foo::hoge"][offset_of!(Foo, hoge) - 4];
["Foo::piyo"][offset_of!(Foo, piyo) - 8];
};
構造体サイズやメンバのオフセットが間違っていたらコンパイルエラーになる(というか rust-analyzer が教えてくれる)。["Foo size"]
は[&str; 1]
で、[size_of::<Foo> - 12]
が 0 になるようにしてるのね。(長さ 1 の配列a
のa[0]
にアクセスしてる)
UEFI スペックみながら構造体書いてたら、いつの間にかオフセットずれてて爆死なんてことが防げそう