include/qemu/compiler: add QEMU_UNINITIALIZED attribute macro

The QEMU_UNINITIALIZED macro is to be used to skip the default compiler
variable initialization done by -ftrivial-auto-var-init=zero.

Use this in cases where there a method in the device I/O path (or other
important hot paths), that has large variables on the stack. A rule of
thumb is that "large" means a method with 4kb data in the local stack
frame. Any variables which are KB in size, should be annotated with this
attribute, to pre-emptively eliminate any potential overhead from the
compiler zero'ing memory.

Given that this turns off a security hardening feature, when using this
to flag variables, it is important that the code is double-checked to
ensure there is no possible use of uninitialized data in the method.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Message-id: 20250610123709.835102-2-berrange@redhat.com
[DB: split off patch & rewrite guidance on when to use the annotation]
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2025-06-10 13:36:39 +01:00
parent d9ce74873a
commit c653b67d18

View file

@ -207,6 +207,26 @@
# define QEMU_USED
#endif
/*
* Disable -ftrivial-auto-var-init on a local variable.
*
* Use this in cases where there a method in the device I/O path (or other
* important hot paths), that has large variables on the stack. A rule of
* thumb is that "large" means a method with 4kb data in the local stack
* frame. Any variables which are KB in size, should be annotated with this
* attribute, to pre-emptively eliminate any potential overhead from the
* compiler's implicit zero'ing of memory.
*
* Given that this turns off a security hardening feature, when using this
* to flag variables, it is important that the code is double-checked to
* ensure there is no possible use of uninitialized data in the method.
*/
#if __has_attribute(uninitialized)
# define QEMU_UNINITIALIZED __attribute__((uninitialized))
#else
# define QEMU_UNINITIALIZED
#endif
/*
* http://clang.llvm.org/docs/ThreadSafetyAnalysis.html
*