Fix -Werror-stringop error on infcmd.c:construct_inferior_arguments
authorPedro Alves <palves@redhat.com>
Wed, 29 Jan 2020 17:53:55 +0000 (12:53 -0500)
committerSergio Durigan Junior <sergiodj@redhat.com>
Wed, 29 Jan 2020 20:23:37 +0000 (15:23 -0500)
While testing a GCC 10 build of our git HEAD, Sergio noticed an error
triggered by -Werror-stringop on
infcmd.c:construct_inferior_arguments.  One of the things the function
does is calculate the length of the string that will hold the
inferior's arguments.  GCC warns us that 'length' can be 0, which can
lead to undesired behaviour:

../../gdb/infcmd.c: In function 'char* construct_inferior_arguments(int, char**)':
../../gdb/infcmd.c:369:17: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=]
  369 |       result[0] = '\0';
      |       ~~~~~~~~~~^~~~~~
../../gdb/infcmd.c:368:33: note: at offset 0 to an object with size 0 allocated by 'xmalloc' here
  368 |       result = (char *) xmalloc (length);
      |                         ~~~~~~~~^~~~~~~~

The solution here is to assert that 'argc' is greater than 0 on entry,
which makes GCC understand that the loops always run at least once,
and thus 'length' is always > 0.

Tested by rebuilding.

gdb/ChangeLog:
2020-01-29  Pedro Alves  <palves@redhat.com>
    Sergio Durigan Junior  <sergiodj@redhat.com>

* infcmd.c (construct_inferior_arguments): Assert that
'argc' is greater than 0.

Change-Id: Ide8407cbedcb4921de1843a6a15bbcb7676c7d26

gdb/ChangeLog
gdb/infcmd.c

index ee2ba1c38dba82c3ad20f632e97a7ff8570d44be..535249196a8985f41bb41aeb5f3af8b999b7218d 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-29  Pedro Alves  <palves@redhat.com>
+           Sergio Durigan Junior  <sergiodj@redhat.com>
+
+       * infcmd.c (construct_inferior_arguments): Assert that
+       'argc' is greater than 0.
+
 2020-01-29  Luis Machado  <luis.machado@linaro.org>
 
        * aarch64-tdep.c (BRK_INSN_MASK): Define to 0xffe0001f.
index b44adca88df047959467c564877f0bbfd4f15a9e..62890bde2a22de57e90616a65d1b8b5d6e9136ba 100644 (file)
@@ -268,6 +268,11 @@ construct_inferior_arguments (int argc, char **argv)
 {
   char *result;
 
+  /* ARGC should always be at least 1, but we double check this
+     here.  This is also needed to silence -Werror-stringop
+     warnings.  */
+  gdb_assert (argc > 0);
+
   if (startup_with_shell)
     {
 #ifdef __MINGW32__