From e99955cd8eca9ac8eff828e8c7b676955fd46e04 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 1 Feb 2018 13:21:41 +0000 Subject: [PATCH] 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 : 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 : 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. --- 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 e71a53a3208..664a974b8dd 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2018-02-01 Simon Marchi + + * 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 * elflink.c (bfd_elf_define_start_stop): Fix check of diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 5cbb0355329..9e4a4b5574d 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 3fe4555230a..d1eb82020cf 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 2db90b5157b..c1a37c14a45 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2018-02-01 Simon Marchi + + * ldexp.c (fold_name, exp_fold_tree_1): Avoid pointer arithmetic + on NULL pointer. + 2018-01-31 H.J. Lu * testsuite/ld-elf/pr21964-5.c (my_var): Mark as used. diff --git a/ld/ldexp.c b/ld/ldexp.c index a0972058fe1..bf0df44a438 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); } -- 2.30.2