options: fix integer overflow

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.
This commit is contained in:
Martin Liska 2020-12-15 09:57:19 +01:00
parent 61e3c180ad
commit 5c5eb7e487
2 changed files with 22 additions and 3 deletions

View 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;

View File

@ -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)
{
}