# 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.