-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Closed
Labels
bugObserved behavior contradicts documented or intended behaviorObserved behavior contradicts documented or intended behaviorstage1The process of building from source via WebAssembly and the C backend.The process of building from source via WebAssembly and the C backend.
Milestone
Description
The byte offsets of fields within a packed struct are sometimes incorrect, see the below example.
const std = @import("std");
const PackedStruct = packed struct {
/// bitoffset = 0, byteoffset = 0
bool_a: bool,
/// bitoffset = 1, byteoffset = 0
bool_b: bool,
/// bitoffset = 2, byteoffset = 0
bool_c: bool,
/// bitoffset = 3, byteoffset = 0
bool_d: bool,
/// bitoffset = 4, byteoffset = 0
bool_e: bool,
/// bitoffset = 5, byteoffset = 0
bool_f: bool,
/// bitoffset = 6, byteoffset = 0
u1_a: u1,
/// bitoffset = 7, byteoffset = 0
bool_g: bool,
/// bitoffset = 8, byteoffset = 1
u1_b: u1,
/// bitoffset = 9, byteoffset = 1
u3_a: u3,
/// bitoffset = 12, byteoffset = 1
u10_a: u10,
/// bitoffset = 22, byteoffset = 2
u10_b: u10,
};
pub fn main() void {
inline for (@typeInfo(PackedStruct).Struct.fields) |field| {
std.debug.warn("field={}, byteoffset={} bitoffset={}\n",
field.name,
usize(@byteOffsetOf(PackedStruct, field.name)),
usize(@bitOffsetOf(PackedStruct, field.name))
);
}
std.debug.warn("totalsize {} bytes\n", usize(@sizeOf(PackedStruct)));
}
The comments show what the bit offsets and byte offsets should be judging by the documentation[1], but below is the result:
field=bool_a, byteoffset=0 bitoffset=0
field=bool_b, byteoffset=0 bitoffset=1
field=bool_c, byteoffset=0 bitoffset=2
field=bool_d, byteoffset=0 bitoffset=3
field=bool_e, byteoffset=0 bitoffset=4
field=bool_f, byteoffset=0 bitoffset=5
field=u1_a, byteoffset=0 bitoffset=6
field=bool_g, byteoffset=0 bitoffset=7
field=u1_b, byteoffset=1 bitoffset=8
field=u3_a, byteoffset=1 bitoffset=9
field=u10_a, byteoffset=1 bitoffset=12
field=u10_b, byteoffset=1 bitoffset=22
totalsize 5 bytes
The size is also incorrect, since it should be 4 bytes (the sum of the fields) but is instead 5.
1: "bool fields use exactly 1 bit" and "Zig supports arbitrary width Integers and although normally, integers with fewer than 8 bits will still use 1 byte of memory, in packed structs, they use exactly their bit width" at https://ziglang.org/documentation/0.4.0/#packed-struct
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
bugObserved behavior contradicts documented or intended behaviorObserved behavior contradicts documented or intended behaviorstage1The process of building from source via WebAssembly and the C backend.The process of building from source via WebAssembly and the C backend.