mirror of
https://github.com/Motorhead1991/qemu.git
synced 2026-01-04 05:30:31 -07:00
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:
parent
d9ce74873a
commit
c653b67d18
1 changed files with 20 additions and 0 deletions
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue