Prevent possible undefined behaviour computing the size of the scache by usingunsigne...
authorNick Clifton <nickc@redhat.com>
Thu, 4 Feb 2016 16:27:06 +0000 (16:27 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 4 Feb 2016 16:27:06 +0000 (16:27 +0000)
* cgen-scache.c (scache_option_handler): Prevent possible
undefined behaviour computing the size of the scache by using
unsigned integers instead of signed integers.

sim/common/ChangeLog
sim/common/cgen-scache.c

index fe25803..0483f8a 100644 (file)
@@ -1,3 +1,9 @@
+2016-02-04  Nick Clifton  <nickc@redhat.com>
+
+       * cgen-scache.c (scache_option_handler): Prevent possible
+       undefined behaviour computing the size of the scache by using
+       unsigned integers instead of signed integers.
+
 2016-01-17  Joel Brobecker  <brobecker@adacore.com>
 
        * sim-fpu.c: Minor comment fixes throughout.
index 3a79514..cd1aa11 100644 (file)
@@ -121,24 +121,26 @@ scache_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
        {
          if (arg != NULL)
            {
-             int n = strtol (arg, NULL, 0);
+             unsigned int n = (unsigned int) strtoul (arg, NULL, 0);
              if (n < MIN_SCACHE_SIZE)
                {
-                 sim_io_eprintf (sd, "invalid scache size `%d', must be at least 4", n);
+                 sim_io_eprintf (sd, "invalid scache size `%u', must be at least %u",
+                                 n, MIN_SCACHE_SIZE);
                  return SIM_RC_FAIL;
                }
              /* Ensure it's a multiple of 2.  */
              if ((n & (n - 1)) != 0)
                {
-                 sim_io_eprintf (sd, "scache size `%d' not a multiple of 2\n", n);
-                 {
-                   /* round up to nearest multiple of 2 */
-                   int i;
-                   for (i = 1; i < n; i <<= 1)
-                     continue;
-                   n = i;
-                 }
-                 sim_io_eprintf (sd, "rounding scache size up to %d\n", n);
+                 unsigned int i;
+                 sim_io_eprintf (sd, "scache size `%u' not a multiple of 2\n", n);
+                 /* Round up to nearest multiple of 2.  */
+                 for (i = 1; i && i < n; i <<= 1)
+                   continue;
+                 if (i)
+                   {
+                     n = i;
+                     sim_io_eprintf (sd, "rounding scache size up to %u\n", n);
+                   }
                }
              if (cpu == NULL)
                STATE_SCACHE_SIZE (sd) = n;