linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).