options: fix integer overflow
authorMartin Liska <mliska@suse.cz>
Tue, 15 Dec 2020 08:57:19 +0000 (09:57 +0100)
committerMartin Liska <mliska@suse.cz>
Wed, 16 Dec 2020 09:20:45 +0000 (10:20 +0100)
gcc/ChangeLog:

PR rtl-optimization/98271
PR rtl-optimization/98276
PR tree-optimization/98279
* opts-common.c (set_option): Do not allow overflow for integer
arguments.

gcc/testsuite/ChangeLog:

PR rtl-optimization/98271
PR rtl-optimization/98276
PR tree-optimization/98279
* gcc.dg/pr98271.c: New test.

gcc/opts-common.c
gcc/testsuite/gcc.dg/pr98271.c [new file with mode: 0644]

index 8ec8c1ec1a8a1c14f998c057f36eac84a1734ec1..30be7d5bf470c98ea4bd2fab6de95f323d2b7f30 100644 (file)
@@ -1466,9 +1466,15 @@ set_option (struct gcc_options *opts, struct gcc_options *opts_set,
          }
        else
          {
-           *(int *) flag_var = value;
-           if (set_flag_var)
-             *(int *) set_flag_var = 1;
+           if (value > INT_MAX)
+             error_at (loc, "argument to %qs is bigger than %d",
+                       option->opt_text, INT_MAX);
+           else
+             {
+               *(int *) flag_var = value;
+               if (set_flag_var)
+                 *(int *) set_flag_var = 1;
+             }
          }
 
        break;
diff --git a/gcc/testsuite/gcc.dg/pr98271.c b/gcc/testsuite/gcc.dg/pr98271.c
new file mode 100644 (file)
index 0000000..b453434
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR rtl-optimization/98271 */
+/* PR rtl-optimization/98276 */
+/* PR tree-optimization/98279 */
+/* { dg-do compile } */
+/* { dg-options "-O --param=align-loop-iterations=1197120096074465280 --param=gcse-cost-distance-ratio=2147483648 --param=hot-bb-frequency-fraction=2147483648" } */
+/* { dg-error "argument to .--param=align-loop-iterations=. is bigger than 2147483647" "" { target *-*-* } 0 } */
+/* { dg-error "argument to .--param=gcse-cost-distance-ratio=. is bigger than 2147483647" "" { target *-*-* } 0 } */
+/* { dg-error "argument to .--param=hot-bb-frequency-fraction=. is bigger than 2147483647" "" { target *-*-* } 0 } */
+
+void
+foo (void)
+{
+}