Browse Source

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.
binutils-2_31-branch
Simon Marchi 9 years ago
committed by Nick Clifton
parent
commit
e99955cd8e
  1. 7
      bfd/ChangeLog
  2. 2
      bfd/elf64-ppc.c
  3. 4
      bfd/elflink.c
  4. 5
      ld/ChangeLog
  5. 4
      ld/ldexp.c

7
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

2
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);

4
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)

5
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.

4
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);
}

Loading…
Cancel
Save