Message ID | 20200220051551.44000-1-natechancellor@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] mm: kmemleak: Use address-of operator on section symbols | expand |
On Wed, Feb 19, 2020 at 10:15:51PM -0700, Nathan Chancellor wrote: > Clang warns: > > These are not true arrays, they are linker defined symbols, which are > just addresses. Using the address of operator silences the warning and > does not change the resulting assembly with either clang/ld.lld or > gcc/ld (tested with diff + objdump -Dr). > > Link: https://github.com/ClangBuiltLinux/linux/issues/895 > Suggested-by: Nick Desaulniers <ndesaulniers@google.com> > Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com>
On Wed, 19 Feb 2020 22:15:51 -0700 Nathan Chancellor <natechancellor@gmail.com> wrote: > Clang warns: > > These are not true arrays, they are linker defined symbols, which are > just addresses. Using the address of operator silences the warning and > does not change the resulting assembly with either clang/ld.lld or > gcc/ld (tested with diff + objdump -Dr). I guess you forgot to quote the clang output?
On Thu, Feb 20, 2020 at 05:35:01PM -0800, Andrew Morton wrote: > On Wed, 19 Feb 2020 22:15:51 -0700 Nathan Chancellor <natechancellor@gmail.com> wrote: > > > Clang warns: > > > > These are not true arrays, they are linker defined symbols, which are > > just addresses. Using the address of operator silences the warning and > > does not change the resulting assembly with either clang/ld.lld or > > gcc/ld (tested with diff + objdump -Dr). > > I guess you forgot to quote the clang output? Ugh yes, sorry. I can send a v3 later or here it is if you want to stitch it in: ../mm/kmemleak.c:1955:28: warning: array comparison always evaluates to a constant [-Wtautological-compare] if (__start_ro_after_init < _sdata || __end_ro_after_init > _edata) ^ ../mm/kmemleak.c:1955:60: warning: array comparison always evaluates to a constant [-Wtautological-compare] if (__start_ro_after_init < _sdata || __end_ro_after_init > _edata) ^ 2 warnings generated. Cheers, Nathan
diff --git a/mm/kmemleak.c b/mm/kmemleak.c index aa6832432d6a..788dc5509539 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -1952,7 +1952,7 @@ void __init kmemleak_init(void) create_object((unsigned long)__bss_start, __bss_stop - __bss_start, KMEMLEAK_GREY, GFP_ATOMIC); /* only register .data..ro_after_init if not within .data */ - if (__start_ro_after_init < _sdata || __end_ro_after_init > _edata) + if (&__start_ro_after_init < &_sdata || &__end_ro_after_init > &_edata) create_object((unsigned long)__start_ro_after_init, __end_ro_after_init - __start_ro_after_init, KMEMLEAK_GREY, GFP_ATOMIC);
Clang warns: These are not true arrays, they are linker defined symbols, which are just addresses. Using the address of operator silences the warning and does not change the resulting assembly with either clang/ld.lld or gcc/ld (tested with diff + objdump -Dr). Link: https://github.com/ClangBuiltLinux/linux/issues/895 Suggested-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> --- v1 -> v2: https://lore.kernel.org/lkml/20200219045423.54190-6-natechancellor@gmail.com/ * No longer a series because there is no prerequisite patch. * Use address-of operator instead of casting to unsigned long. mm/kmemleak.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)