# Discovering a subtle source of binary bloat in Rust
2022-09-03
After adding a log buffer to the kernel of my OS I noticed the binary size increased by a
substantial amount.
More interestingly, it increased by roughly the size of the buffer,
implying the compiler was putting the buffer in the `.data` section instead of `.bss`.
The culprit is the following structure:
```rust
static LOG: SpinLock = SpinLock::new(Log { buf: [0; SIZE], head: 0, readers: Vec::new() });
```
Try to guess what the issue is :P
`Vec` uses a `NonNull` internally to point to an allocation.
However, as the name implies, `NonNull` cannot be null, so instead it has some non-zero value
instead (i.e. it dangles).
Because of this the `Log` structure isn't all zeroes and the compiler is forced to put it in
the `.data` section.
There's probably a few of these instances in many codebases, so it's worth investigating when
attempting to reduce binary bloat.