diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2025-01-17 10:39:47 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2025-01-20 13:30:27 +0000 |
| commit | 2b76b86c449fff4c26410164052c32f3b9cf56fe (patch) | |
| tree | edcffe7263a530b1e1751d5d3cd48599477c64bf /pkg/declextract/serialization.go | |
| parent | f2cb035c8f931efff4a020b164e657f16f51934b (diff) | |
tools/syz-declextract: fix empty structs and arrays
This fixes 2 bugs:
1. We completly remove empty structs, but they can have
effect on parent struct layout if they have >1 alignment.
Replace empty structs with a special auto_aligner type
that preserves alignment.
2. Arrays of 0 size are currently emitted as dynamically-sized
(we assume 0 size means "this is not a const-size array").
Add separate IsConstSize flag for arrays that marks const-size arrays.
Additionally cross-check that generated structs have exactly
the same size/alignment as the corresponding C structs.
This allows to catch the above bugs.
Diffstat (limited to 'pkg/declextract/serialization.go')
| -rw-r--r-- | pkg/declextract/serialization.go | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/pkg/declextract/serialization.go b/pkg/declextract/serialization.go index 571336097..15e4a34a8 100644 --- a/pkg/declextract/serialization.go +++ b/pkg/declextract/serialization.go @@ -32,6 +32,10 @@ type auto_union[INFERRED, RAW] [ raw RAW ] +type auto_aligner[N] { + void void +} [align[N]] + ` func (ctx *context) fmt(msg string, args ...any) { @@ -76,6 +80,10 @@ func (ctx *context) serializeEnums() { func (ctx *context) serializeStructs() { for _, str := range ctx.Structs { + // Empty structs are not supported, but we also shouldn't emit references to them. + if str.ByteSize == 0 { + continue + } delims := "{}" if str.IsUnion { delims = "[]" @@ -89,8 +97,8 @@ func (ctx *context) serializeStructs() { if str.IsPacked { attrs = append(attrs, "packed") } - if str.Align != 0 { - attrs = append(attrs, fmt.Sprintf("align[%v]", str.Align)) + if str.AlignAttr != 0 { + attrs = append(attrs, fmt.Sprintf("align[%v]", str.AlignAttr)) } if len(attrs) != 0 { ctx.fmt(" [%v]", strings.Join(attrs, ", ")) |
