|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] xen: Use -Wuninitialized and -Winit-self
commit 90a1bc9e825fa087331c63aa12bb64683bd75020
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Fri May 10 23:56:52 2024 +0100
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Sat May 11 00:13:43 2024 +0100
xen: Use -Wuninitialized and -Winit-self
Assigning a variable to itself is an anti-pattern. It introduces definite
UB
in an attempt to silence a warning about possible UB.
As it's definite undefined behaviour, it also mis-compiles in simple cases,
using whatever stale value happened to be in the allocated register.
Clang includes -Wuninitialized within -Wall, but GCC only includes it in
-Wextra, which is not used by Xen at this time.
Furthermore, the specific pattern of assigning a variable to itself in its
declaration is only diagnosed by GCC with -Winit-self. Clang does diagnose
simple forms of this pattern with a plain -Wuninitialized, but it fails to
diagnose the instances in Xen that GCC manages to find.
GCC, with -Wuninitialized and -Winit-self notices:
arch/x86/time.c: In function â??read_pt_and_tscâ??:
arch/x86/time.c:297:14: error: â??bestâ?? is used uninitialized in this
function [-Werror=uninitialized]
297 | uint32_t best = best;
| ^~~~
arch/x86/time.c: In function â??read_pt_and_tmcctâ??:
arch/x86/time.c:1022:14: error: â??bestâ?? is used uninitialized in this
function [-Werror=uninitialized]
1022 | uint64_t best = best;
| ^~~~
Fix these up to start with a value of ~0, which is also more robust in the
case that something goes wrong.
Fixes: 23658e823238 ("x86/time: further improve TSC / CPU freq calibration
accuracy")
Fixes: 3f3906b462d5 ("x86/APIC: calibrate against platform timer when
possible")
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
---
xen/Makefile | 3 ++-
xen/arch/x86/time.c | 4 ++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/xen/Makefile b/xen/Makefile
index 71f0cb5071..da8855f3c3 100644
--- a/xen/Makefile
+++ b/xen/Makefile
@@ -394,9 +394,10 @@ CFLAGS-$(CONFIG_CC_SPLIT_SECTIONS) += -ffunction-sections
-fdata-sections
CFLAGS += -nostdinc -fno-builtin -fno-common
CFLAGS += -Werror -Wredundant-decls -Wwrite-strings -Wno-pointer-arith
-CFLAGS += -Wdeclaration-after-statement
+CFLAGS += -Wdeclaration-after-statement -Wuninitialized
$(call cc-option-add,CFLAGS,CC,-Wvla)
$(call cc-option-add,CFLAGS,CC,-Wflex-array-member-not-at-end)
+$(call cc-option-add,CFLAGS,CC,-Winit-self)
CFLAGS += -pipe -D__XEN__ -include $(srctree)/include/xen/config.h
CFLAGS-$(CONFIG_DEBUG_INFO) += -g
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
index 6f136f4b14..78ea095e3e 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -293,7 +293,7 @@ static uint32_t __init read_pt_and_tsc(uint64_t *tsc,
const struct platform_timesource *pts)
{
uint64_t tsc_prev = *tsc = rdtsc_ordered(), tsc_min = ~0;
- uint32_t best = best;
+ uint32_t best = ~0;
unsigned int i;
for ( i = 0; ; ++i )
@@ -1018,7 +1018,7 @@ static u64 __init init_platform_timer(void)
static uint64_t __init read_pt_and_tmcct(uint32_t *tmcct)
{
uint32_t tmcct_prev = *tmcct = apic_tmcct_read(), tmcct_min = ~0;
- uint64_t best = best;
+ uint64_t best = ~0;
unsigned int i;
for ( i = 0; ; ++i )
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |