dwarf.c: string_fortify.h strncpy error
authorAlan Modra <amodra@gmail.com>
Fri, 18 Jun 2021 08:54:43 +0000 (18:24 +0930)
committerAlan Modra <amodra@gmail.com>
Sat, 19 Jun 2021 01:38:00 +0000 (11:08 +0930)
In function 'strncpy',
    inlined from 'display_debug_lines_decoded' at /home/alan/src/binutils-gdb/binutils/dwarf.c:5434:5,
    inlined from 'display_debug_lines' at /home/alan/src/binutils-gdb/binutils/dwarf.c:5567:21:
/usr/include/bits/string_fortified.h:95:10: error: '__builtin_strncpy' specified bound 36 equals destination size [-Werror=stringop-truncation]

No need for strncpy here, the string being copied always fits the
destination buffer.

* dwarf.c (display_debug_lines_decoded): Use memcpy rather than
strncpy when trimming file name length to MAX_FILENAME_LENGTH.
Don't make an unnecessary copy when length is good.

binutils/ChangeLog
binutils/dwarf.c

index 125dd2e1a3188d70b049881abdfebc162a0b8491..c6a05ca6b3eea50d45a32496e617269103db3422 100644 (file)
@@ -1,3 +1,9 @@
+2021-06-19  Alan Modra  <amodra@gmail.com>
+
+       * dwarf.c (display_debug_lines_decoded): Use memcpy rather than
+       strncpy when trimming file name length to MAX_FILENAME_LENGTH.
+       Don't make an unnecessary copy when length is good.
+
 2021-06-18  H.J. Lu  <hongjiu.lu@intel.com>
 
        * readelf.c (print_gnu_property_note): Handle
index ebc7b023e3bb026b114f85c15f5c1e41726c988f..a57f0dab6b268c9326a18d9e9997544a4c74eb63 100644 (file)
@@ -5426,31 +5426,22 @@ display_debug_lines_decoded (struct dwarf_section *  section,
                fileName = _("<unknown>");
 
              fileNameLength = strlen (fileName);
-
-             if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
+             newFileName = fileName;
+             if (fileNameLength > MAX_FILENAME_LENGTH && !do_wide)
                {
                  newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
                  /* Truncate file name */
-                 strncpy (newFileName,
-                          fileName + fileNameLength - MAX_FILENAME_LENGTH,
-                          MAX_FILENAME_LENGTH + 1);
-                 /* FIXME: This is to pacify gcc-10 which can warn that the
-                    strncpy above might leave a non-NUL terminated string
-                    in newFileName.  It won't, but gcc's analysis doesn't
-                    quite go far enough to discover this.  */
+                 memcpy (newFileName,
+                         fileName + fileNameLength - MAX_FILENAME_LENGTH,
+                         MAX_FILENAME_LENGTH);
                  newFileName[MAX_FILENAME_LENGTH] = 0;
                }
-             else
-               {
-                 newFileName = (char *) xmalloc (fileNameLength + 1);
-                 strncpy (newFileName, fileName, fileNameLength + 1);
-               }
 
              /* A row with end_seq set to true has a meaningful address, but
                 the other information in the same row is not significant.
                 In such a row, print line as "-", and don't print
                 view/is_stmt.  */
-             if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
+             if (!do_wide || fileNameLength <= MAX_FILENAME_LENGTH)
                {
                  if (linfo.li_max_ops_per_insn == 1)
                    {
@@ -5525,7 +5516,8 @@ display_debug_lines_decoded (struct dwarf_section *  section,
                  putchar ('\n');
                }
 
-             free (newFileName);
+             if (newFileName != fileName)
+               free (newFileName);
            }
        }