* [PATCH] x86-64: Fix gcc-7 warning in relocs.c @ 2016-12-15 12:45 Markus Trippelsdorf 2016-12-19 10:56 ` [tip:x86/urgent] x86/tools: " tip-bot for Markus Trippelsdorf 0 siblings, 1 reply; 9+ messages in thread From: Markus Trippelsdorf @ 2016-12-15 12:45 UTC (permalink / raw) To: linux-kernel; +Cc: Thomas Gleixner gcc-7 warns: In file included from arch/x86/tools/relocs_64.c:17:0: arch/x86/tools/relocs.c: In function ‘process_64’: arch/x86/tools/relocs.c:953:2: warning: argument 1 null where non-null expected [-Wnonnull] qsort(r->offset, r->count, sizeof(r->offset[0]), cmp_relocs); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from arch/x86/tools/relocs.h:6:0, from arch/x86/tools/relocs_64.c:1: /usr/include/stdlib.h:741:13: note: in a call to function ‘qsort’ declared here extern void qsort This happens because relocs16 is not used for ELF_BITS == 64, so there is no point in trying to sort it. Fixed by guarding the sort_relocs(&relocs16) call. Signed-off-by: Markus Trippelsdorf <markus@trippelsdorf.de> diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c index 0c2fae8d929d..73eb7fd4aec4 100644 --- a/arch/x86/tools/relocs.c +++ b/arch/x86/tools/relocs.c @@ -992,11 +992,12 @@ static void emit_relocs(int as_text, int use_real_mode) die("Segment relocations found but --realmode not specified\n"); /* Order the relocations for more efficient processing */ - sort_relocs(&relocs16); sort_relocs(&relocs32); #if ELF_BITS == 64 sort_relocs(&relocs32neg); sort_relocs(&relocs64); +#else + sort_relocs(&relocs16); #endif /* Print the relocations */ -- Markus ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [tip:x86/urgent] x86/tools: Fix gcc-7 warning in relocs.c 2016-12-15 12:45 [PATCH] x86-64: Fix gcc-7 warning in relocs.c Markus Trippelsdorf @ 2016-12-19 10:56 ` tip-bot for Markus Trippelsdorf 2016-12-20 9:30 ` H. Peter Anvin 0 siblings, 1 reply; 9+ messages in thread From: tip-bot for Markus Trippelsdorf @ 2016-12-19 10:56 UTC (permalink / raw) To: linux-tip-commits; +Cc: mingo, tglx, markus, hpa, linux-kernel Commit-ID: 7ebb916782949621ff6819acf373a06902df7679 Gitweb: http://git.kernel.org/tip/7ebb916782949621ff6819acf373a06902df7679 Author: Markus Trippelsdorf <markus@trippelsdorf.de> AuthorDate: Thu, 15 Dec 2016 13:45:13 +0100 Committer: Thomas Gleixner <tglx@linutronix.de> CommitDate: Mon, 19 Dec 2016 11:50:24 +0100 x86/tools: Fix gcc-7 warning in relocs.c gcc-7 warns: In file included from arch/x86/tools/relocs_64.c:17:0: arch/x86/tools/relocs.c: In function ‘process_64’: arch/x86/tools/relocs.c:953:2: warning: argument 1 null where non-null expected [-Wnonnull] qsort(r->offset, r->count, sizeof(r->offset[0]), cmp_relocs); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from arch/x86/tools/relocs.h:6:0, from arch/x86/tools/relocs_64.c:1: /usr/include/stdlib.h:741:13: note: in a call to function ‘qsort’ declared here extern void qsort This happens because relocs16 is not used for ELF_BITS == 64, so there is no point in trying to sort it. Make the sort_relocs(&relocs16) call 32bit only. Signed-off-by: Markus Trippelsdorf <markus@trippelsdorf.de> Link: http://lkml.kernel.org/r/20161215124513.GA289@x4 Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- arch/x86/tools/relocs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c index 0c2fae8..73eb7fd 100644 --- a/arch/x86/tools/relocs.c +++ b/arch/x86/tools/relocs.c @@ -992,11 +992,12 @@ static void emit_relocs(int as_text, int use_real_mode) die("Segment relocations found but --realmode not specified\n"); /* Order the relocations for more efficient processing */ - sort_relocs(&relocs16); sort_relocs(&relocs32); #if ELF_BITS == 64 sort_relocs(&relocs32neg); sort_relocs(&relocs64); +#else + sort_relocs(&relocs16); #endif /* Print the relocations */ ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [tip:x86/urgent] x86/tools: Fix gcc-7 warning in relocs.c 2016-12-19 10:56 ` [tip:x86/urgent] x86/tools: " tip-bot for Markus Trippelsdorf @ 2016-12-20 9:30 ` H. Peter Anvin 2016-12-20 10:00 ` Markus Trippelsdorf 0 siblings, 1 reply; 9+ messages in thread From: H. Peter Anvin @ 2016-12-20 9:30 UTC (permalink / raw) To: markus, tglx, linux-kernel, mingo, linux-tip-commits I'd strongly prefer a non-data-dependent solution, specifically adding at the top of sort_relocs(): if (!r->count) return; However, by my reading of the C and POSIX standards, this is a gcc error: qsort() should do nothing if the count is zero. -hpa On 12/19/16 02:56, tip-bot for Markus Trippelsdorf wrote: > Commit-ID: 7ebb916782949621ff6819acf373a06902df7679 > Gitweb: http://git.kernel.org/tip/7ebb916782949621ff6819acf373a06902df7679 > Author: Markus Trippelsdorf <markus@trippelsdorf.de> > AuthorDate: Thu, 15 Dec 2016 13:45:13 +0100 > Committer: Thomas Gleixner <tglx@linutronix.de> > CommitDate: Mon, 19 Dec 2016 11:50:24 +0100 > > x86/tools: Fix gcc-7 warning in relocs.c > > gcc-7 warns: > > In file included from arch/x86/tools/relocs_64.c:17:0: > arch/x86/tools/relocs.c: In function ‘process_64’: > arch/x86/tools/relocs.c:953:2: warning: argument 1 null where non-null expected [-Wnonnull] > qsort(r->offset, r->count, sizeof(r->offset[0]), cmp_relocs); > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > In file included from arch/x86/tools/relocs.h:6:0, > from arch/x86/tools/relocs_64.c:1: > /usr/include/stdlib.h:741:13: note: in a call to function ‘qsort’ declared here > extern void qsort > > This happens because relocs16 is not used for ELF_BITS == 64, > so there is no point in trying to sort it. > > Make the sort_relocs(&relocs16) call 32bit only. > > Signed-off-by: Markus Trippelsdorf <markus@trippelsdorf.de> > Link: http://lkml.kernel.org/r/20161215124513.GA289@x4 > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> > > --- > arch/x86/tools/relocs.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c > index 0c2fae8..73eb7fd 100644 > --- a/arch/x86/tools/relocs.c > +++ b/arch/x86/tools/relocs.c > @@ -992,11 +992,12 @@ static void emit_relocs(int as_text, int use_real_mode) > die("Segment relocations found but --realmode not specified\n"); > > /* Order the relocations for more efficient processing */ > - sort_relocs(&relocs16); > sort_relocs(&relocs32); > #if ELF_BITS == 64 > sort_relocs(&relocs32neg); > sort_relocs(&relocs64); > +#else > + sort_relocs(&relocs16); > #endif > > /* Print the relocations */ > s ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [tip:x86/urgent] x86/tools: Fix gcc-7 warning in relocs.c 2016-12-20 9:30 ` H. Peter Anvin @ 2016-12-20 10:00 ` Markus Trippelsdorf 2016-12-20 11:10 ` H. Peter Anvin 0 siblings, 1 reply; 9+ messages in thread From: Markus Trippelsdorf @ 2016-12-20 10:00 UTC (permalink / raw) To: H. Peter Anvin; +Cc: tglx, linux-kernel, mingo, linux-tip-commits On 2016.12.20 at 01:30 -0800, H. Peter Anvin wrote: > I'd strongly prefer a non-data-dependent solution, specifically adding > at the top of sort_relocs(): > > if (!r->count) > return; > > However, by my reading of the C and POSIX standards, this is a gcc > error: qsort() should do nothing if the count is zero. No, it is invoking undefined behavior. Notice the nonnull attribute in /usr/include/stdlib.h: 739 /* Sort NMEMB elements of BASE, of SIZE bytes each, 740 using COMPAR to perform the comparisons. */ 741 extern void qsort (void *__base, size_t __nmemb, size_t __size, 742 __compar_fn_t __compar) __nonnull ((1, 4)); But feel free to revert my patch and add your solution. -- Markus ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [tip:x86/urgent] x86/tools: Fix gcc-7 warning in relocs.c 2016-12-20 10:00 ` Markus Trippelsdorf @ 2016-12-20 11:10 ` H. Peter Anvin 2016-12-20 11:51 ` Markus Trippelsdorf 0 siblings, 1 reply; 9+ messages in thread From: H. Peter Anvin @ 2016-12-20 11:10 UTC (permalink / raw) To: Markus Trippelsdorf; +Cc: tglx, linux-kernel, mingo, linux-tip-commits On 12/20/16 02:00, Markus Trippelsdorf wrote: > On 2016.12.20 at 01:30 -0800, H. Peter Anvin wrote: >> I'd strongly prefer a non-data-dependent solution, specifically adding >> at the top of sort_relocs(): >> >> if (!r->count) >> return; >> >> However, by my reading of the C and POSIX standards, this is a gcc >> error: qsort() should do nothing if the count is zero. > > No, it is invoking undefined behavior. H > Notice the nonnull attribute in /usr/include/stdlib.h: > > 739 /* Sort NMEMB elements of BASE, of SIZE bytes each, > 740 using COMPAR to perform the comparisons. */ > 741 extern void qsort (void *__base, size_t __nmemb, size_t __size, > 742 __compar_fn_t __compar) __nonnull ((1, 4)); > > But feel free to revert my patch and add your solution. Well, s/gcc/glibc/ then. > The qsort() function shall sort an array of nel objects, the > initial element of which is pointed to by base. The size of > each object, in bytes, is specified by the width argument. If > the nel argument has the value zero, the comparison function > pointed to by compar shall not be called and no rearrangement > shall take place. -hpa ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [tip:x86/urgent] x86/tools: Fix gcc-7 warning in relocs.c 2016-12-20 11:10 ` H. Peter Anvin @ 2016-12-20 11:51 ` Markus Trippelsdorf 2016-12-20 18:32 ` hpa 0 siblings, 1 reply; 9+ messages in thread From: Markus Trippelsdorf @ 2016-12-20 11:51 UTC (permalink / raw) To: H. Peter Anvin; +Cc: tglx, linux-kernel, mingo, linux-tip-commits On 2016.12.20 at 03:10 -0800, H. Peter Anvin wrote: > On 12/20/16 02:00, Markus Trippelsdorf wrote: > > On 2016.12.20 at 01:30 -0800, H. Peter Anvin wrote: > >> I'd strongly prefer a non-data-dependent solution, specifically adding > >> at the top of sort_relocs(): > >> > >> if (!r->count) > >> return; > >> > >> However, by my reading of the C and POSIX standards, this is a gcc > >> error: qsort() should do nothing if the count is zero. > > > > No, it is invoking undefined behavior. > > > Notice the nonnull attribute in /usr/include/stdlib.h: > > > > 739 /* Sort NMEMB elements of BASE, of SIZE bytes each, > > 740 using COMPAR to perform the comparisons. */ > > 741 extern void qsort (void *__base, size_t __nmemb, size_t __size, > > 742 __compar_fn_t __compar) __nonnull ((1, 4)); > > > > But feel free to revert my patch and add your solution. > > Well, s/gcc/glibc/ then. > > > The qsort() function shall sort an array of nel objects, the > > initial element of which is pointed to by base NULL does not point to any object, therefore it is UB. -- Markus ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [tip:x86/urgent] x86/tools: Fix gcc-7 warning in relocs.c 2016-12-20 11:51 ` Markus Trippelsdorf @ 2016-12-20 18:32 ` hpa 2016-12-20 19:31 ` Markus Trippelsdorf 0 siblings, 1 reply; 9+ messages in thread From: hpa @ 2016-12-20 18:32 UTC (permalink / raw) To: Markus Trippelsdorf; +Cc: tglx, linux-kernel, mingo, linux-tip-commits On December 20, 2016 3:51:09 AM PST, Markus Trippelsdorf <markus@trippelsdorf.de> wrote: >On 2016.12.20 at 03:10 -0800, H. Peter Anvin wrote: >> On 12/20/16 02:00, Markus Trippelsdorf wrote: >> > On 2016.12.20 at 01:30 -0800, H. Peter Anvin wrote: >> >> I'd strongly prefer a non-data-dependent solution, specifically >adding >> >> at the top of sort_relocs(): >> >> >> >> if (!r->count) >> >> return; >> >> >> >> However, by my reading of the C and POSIX standards, this is a gcc >> >> error: qsort() should do nothing if the count is zero. >> > >> > No, it is invoking undefined behavior. >> >> > Notice the nonnull attribute in /usr/include/stdlib.h: >> > >> > 739 /* Sort NMEMB elements of BASE, of SIZE bytes each, >> > 740 using COMPAR to perform the comparisons. */ >> > 741 extern void qsort (void *__base, size_t __nmemb, size_t __size, >> > 742 __compar_fn_t __compar) __nonnull ((1, 4)); >> > >> > But feel free to revert my patch and add your solution. >> >> Well, s/gcc/glibc/ then. >> >> > The qsort() function shall sort an array of nel objects, >the >> > initial element of which is pointed to by base > >NULL does not point to any object, therefore it is UB. That seems, quite frankly, like a pretty idiotic lawyerism. Why would a pointer that by spec is never referenced not be able to be null? -- Sent from my Android device with K-9 Mail. Please excuse my brevity. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [tip:x86/urgent] x86/tools: Fix gcc-7 warning in relocs.c 2016-12-20 18:32 ` hpa @ 2016-12-20 19:31 ` Markus Trippelsdorf 2016-12-20 20:44 ` H. Peter Anvin 0 siblings, 1 reply; 9+ messages in thread From: Markus Trippelsdorf @ 2016-12-20 19:31 UTC (permalink / raw) To: hpa; +Cc: tglx, linux-kernel, mingo, linux-tip-commits On 2016.12.20 at 10:32 -0800, hpa@zytor.com wrote: > On December 20, 2016 3:51:09 AM PST, Markus Trippelsdorf <markus@trippelsdorf.de> wrote: > >On 2016.12.20 at 03:10 -0800, H. Peter Anvin wrote: > >> On 12/20/16 02:00, Markus Trippelsdorf wrote: > >> > On 2016.12.20 at 01:30 -0800, H. Peter Anvin wrote: > >> >> I'd strongly prefer a non-data-dependent solution, specifically > >adding > >> >> at the top of sort_relocs(): > >> >> > >> >> if (!r->count) > >> >> return; > >> >> > >> >> However, by my reading of the C and POSIX standards, this is a gcc > >> >> error: qsort() should do nothing if the count is zero. > >> > > >> > No, it is invoking undefined behavior. > >> > >> > Notice the nonnull attribute in /usr/include/stdlib.h: > >> > > >> > 739 /* Sort NMEMB elements of BASE, of SIZE bytes each, > >> > 740 using COMPAR to perform the comparisons. */ > >> > 741 extern void qsort (void *__base, size_t __nmemb, size_t __size, > >> > 742 __compar_fn_t __compar) __nonnull ((1, 4)); > >> > > >> > But feel free to revert my patch and add your solution. > >> > >> Well, s/gcc/glibc/ then. > >> > >> > The qsort() function shall sort an array of nel objects, > >the > >> > initial element of which is pointed to by base > > > >NULL does not point to any object, therefore it is UB. > > That seems, quite frankly, like a pretty idiotic lawyerism. > Why would a pointer that by spec is never referenced not be able to be null? Thank you. Let me quote the standard for you: 7.1.4 »If an argument to a function has an invalid value (such as a value outside the domain of the function, or a pointer outside the address space of the program, or a null pointer, or a pointer to non-modifiable storage when the corresponding parameter is not const-qualified) or a type (after promotion) not expected by a function with variable number of arguments, the behavior is undefined.« 7.24.1(2) »Where an argument declared as size_t n specifies the length of the array for a function, n can have the value zero […] pointer arguments on such a call shall still have valid values, as described in 7.1.4.« The same applies to memcpy, etc. The compiler can assume that these pointers are not NULL and optimizes accordingly. -- Markus ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [tip:x86/urgent] x86/tools: Fix gcc-7 warning in relocs.c 2016-12-20 19:31 ` Markus Trippelsdorf @ 2016-12-20 20:44 ` H. Peter Anvin 0 siblings, 0 replies; 9+ messages in thread From: H. Peter Anvin @ 2016-12-20 20:44 UTC (permalink / raw) To: Markus Trippelsdorf; +Cc: tglx, linux-kernel, mingo, linux-tip-commits On 12/20/16 11:31, Markus Trippelsdorf wrote: > > 7.24.1(2) > »Where an argument declared as size_t n specifies the length of the > array for a function, n can have the value zero […] pointer arguments on > such a call shall still have valid values, as described in 7.1.4.« > OK, fair enough. -hpa ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2016-12-20 21:14 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2016-12-15 12:45 [PATCH] x86-64: Fix gcc-7 warning in relocs.c Markus Trippelsdorf 2016-12-19 10:56 ` [tip:x86/urgent] x86/tools: " tip-bot for Markus Trippelsdorf 2016-12-20 9:30 ` H. Peter Anvin 2016-12-20 10:00 ` Markus Trippelsdorf 2016-12-20 11:10 ` H. Peter Anvin 2016-12-20 11:51 ` Markus Trippelsdorf 2016-12-20 18:32 ` hpa 2016-12-20 19:31 ` Markus Trippelsdorf 2016-12-20 20:44 ` H. Peter Anvin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).