re PR fortran/36515 (Integer read from stdin yields a value overflow for a valid...
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 15 Jun 2008 20:02:58 +0000 (20:02 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 15 Jun 2008 20:02:58 +0000 (20:02 +0000)
2008-06-15  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR fortran/36515
* libgfortran.h (compile_options_t): Add int range_check to structure.
* runtime/compile_options.c (set_options): Add range_check option.
(init_compile_options): Likewise.
*io/read.c (read_decimal): Change overflow checks to include
range_check.

From-SVN: r136822

libgfortran/ChangeLog
libgfortran/io/read.c
libgfortran/libgfortran.h
libgfortran/runtime/compile_options.c

index 0966d4874576df27a7e6a1297c6de4a921572b7a..f5b6a2731c0f4ffe9d3d0e3661ac67694f062453 100644 (file)
@@ -1,3 +1,12 @@
+2008-06-14  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/36515
+       * libgfortran.h (compile_options_t): Add int range_check to structure.
+       * runtime/compile_options.c (set_options): Add range_check option.
+       (init_compile_options): Likewise.
+       *io/read.c (read_decimal): Change overflow checks to include
+       range_check.
+       
 2008-06-13  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR fortran/36538
index 11a1ac018f7667b3a6021619b1382804c001077b..cb88933bf97b98a6386f39774bc0f803bff373dc 100644 (file)
@@ -428,13 +428,13 @@ read_decimal (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
       if (c < '0' || c > '9')
        goto bad;
 
-      if (value > maxv_10)
+      if (value > maxv_10 && compile_options.range_check == 1)
        goto overflow;
 
       c -= '0';
       value = 10 * value;
 
-      if (value > maxv - c)
+      if (value > maxv - c && compile_options.range_check == 1)
        goto overflow;
       value += c;
     }
index 8c0f1b4a796f42e6a3cd0c3b3f40aa58cf9ef2dd..10439bd3e5a4098be38ec9569ce4cbca1b4c7855 100644 (file)
@@ -477,6 +477,7 @@ typedef struct
   size_t record_marker;
   int max_subrecord_length;
   int bounds_check;
+  int range_check;
 }
 compile_options_t;
 
index 8e0a3fe30ceddad6979afb7ed7cfa324996c585d..c62fe1c326af258e1223f0ad5a2481c0f467406d 100644 (file)
@@ -105,6 +105,8 @@ set_options (int num, int options[])
     compile_options.sign_zero = options[5];
   if (num >= 7)
     compile_options.bounds_check = options[6];
+  if (num >= 8)
+    compile_options.range_check = options[7];
 
   /* If backtrace is required, we set signal handlers on most common
      signals.  */
@@ -146,6 +148,7 @@ init_compile_options (void)
   compile_options.dump_core = 0;
   compile_options.backtrace = 0;
   compile_options.sign_zero = 1;
+  compile_options.range_check = 1;
 }
 
 /* Function called by the front-end to tell us the