This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix compile time warnings building the binutils with clang.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e99955cd8eca9ac8eff828e8c7b676955fd46e04

commit e99955cd8eca9ac8eff828e8c7b676955fd46e04
Author: Simon Marchi <simon.marchi@ericsson.com>
Date:   Thu Feb 1 13:21:41 2018 +0000

    Fix compile time warnings building the binutils with clang.
    
    bfdI would like to fix instances of the following warning, when building
    with clang with no special CFLAGS other than -g3 -O0.
    
    /home/emaisin/src/binutils-gdb/bfd/elflink.c:5425:45: error: performing pointer arithmetic on a null pointer has undefined behavior [-Werror,-Wnull-pointer-arithmetic]
        return (struct elf_link_hash_entry *) 0 - 1;
               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
    
    Replacing those with "(struct elf_link_hash_entry *) -1" gets rid of the
    warning.  I wanted to check that it didn't change the resulting code, so
    I tried to build this:
    
      $ cat test.c
      int *before()
      {
              return (int *) 0 - 1;
      }
    
      int *after()
      {
              return (int *) - 1;
      }
    
      $ gcc -c test.c -g
      $ objdump -d test.o
    
      test.o:     file format elf64-x86-64
    
      Disassembly of section .text:
    
      0000000000000000 <before>:
         0:   55                      push   %rbp
         1:   48 89 e5                mov    %rsp,%rbp
         4:   48 c7 c0 fc ff ff ff    mov    $0xfffffffffffffffc,%rax
         b:   5d                      pop    %rbp
         c:   c3                      retq
    
      000000000000000d <after>:
         d:   55                      push   %rbp
         e:   48 89 e5                mov    %rsp,%rbp
        11:   48 c7 c0 ff ff ff ff    mov    $0xffffffffffffffff,%rax
        18:   5d                      pop    %rbp
        19:   c3                      retq
    
    This shows that the previous code doesn't actually return -1 as the
    function documentation says, but the new one does, so it's kind of a
    bugfix.
    
    bfd	* elf64-ppc.c (ppc64_elf_archive_symbol_lookup): Avoid pointer
    	arithmetic on NULL pointer.
    	* elflink.c (_bfd_elf_archive_symbol_lookup,
    	elf_link_add_archive_symbols): Likewise.
    
    ld	* ldexp.c (fold_name, exp_fold_tree_1): Avoid pointer arithmetic
    	on NULL pointer.

Diff:
---
 bfd/ChangeLog   | 7 +++++++
 bfd/elf64-ppc.c | 2 +-
 bfd/elflink.c   | 4 ++--
 ld/ChangeLog    | 5 +++++
 ld/ldexp.c      | 4 ++--
 5 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e71a53a..664a974 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2018-02-01  Simon Marchi  <simon.marchi@ericsson.com>
+
+	* elf64-ppc.c (ppc64_elf_archive_symbol_lookup): Avoid pointer
+	arithmetic on NULL pointer.
+	* elflink.c (_bfd_elf_archive_symbol_lookup,
+	elf_link_add_archive_symbols): Likewise.
+
 2018-01-31  Michael Matz  <matz@suse.de>
 
 	* elflink.c (bfd_elf_define_start_stop): Fix check of
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 5cbb035..9e4a4b5 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -5051,7 +5051,7 @@ ppc64_elf_archive_symbol_lookup (bfd *abfd,
   len = strlen (name);
   dot_name = bfd_alloc (abfd, len + 2);
   if (dot_name == NULL)
-    return (struct elf_link_hash_entry *) 0 - 1;
+    return (struct elf_link_hash_entry *) -1;
   dot_name[0] = '.';
   memcpy (dot_name + 1, name, len + 1);
   h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 3fe4555..d1eb820 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -5422,7 +5422,7 @@ _bfd_elf_archive_symbol_lookup (bfd *abfd,
   len = strlen (name);
   copy = (char *) bfd_alloc (abfd, len);
   if (copy == NULL)
-    return (struct elf_link_hash_entry *) 0 - 1;
+    return (struct elf_link_hash_entry *) -1;
 
   first = p - name + 1;
   memcpy (copy, name, first);
@@ -5520,7 +5520,7 @@ elf_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
 	    }
 
 	  h = archive_symbol_lookup (abfd, info, symdef->name);
-	  if (h == (struct elf_link_hash_entry *) 0 - 1)
+	  if (h == (struct elf_link_hash_entry *) -1)
 	    goto error_return;
 
 	  if (h == NULL)
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 2db90b5..c1a37c1 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,8 @@
+2018-02-01  Simon Marchi  <simon.marchi@ericsson.com>
+
+	* ldexp.c (fold_name, exp_fold_tree_1): Avoid pointer arithmetic
+	on NULL pointer.
+
 2018-01-31  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* testsuite/ld-elf/pr21964-5.c (my_var): Mark as used.
diff --git a/ld/ldexp.c b/ld/ldexp.c
index a097205..bf0df44 100644
--- a/ld/ldexp.c
+++ b/ld/ldexp.c
@@ -782,7 +782,7 @@ fold_name (etree_type *tree)
 	  if (expld.assign_src == NULL)
 	    expld.assign_src = h;
 	  else
-	    expld.assign_src = (struct bfd_link_hash_entry *) 0 - 1;
+	    expld.assign_src = (struct bfd_link_hash_entry *) - 1;
 	}
       break;
 
@@ -1207,7 +1207,7 @@ exp_fold_tree_1 (etree_type *tree)
 		     false branches.)  */
 		  if (expld.assign_src != NULL
 		      && (expld.assign_src
-			  != (struct bfd_link_hash_entry *) 0 - 1))
+			  != (struct bfd_link_hash_entry *) -1))
 		    bfd_copy_link_hash_symbol_type (link_info.output_bfd, h,
 						    expld.assign_src);
 		}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]