]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR 28105 Remove size<0 checks before calling malloc/realloc
authorJanne Blomqvist <jb@gcc.gnu.org>
Wed, 15 Dec 2010 17:15:25 +0000 (19:15 +0200)
committerJanne Blomqvist <jb@gcc.gnu.org>
Wed, 15 Dec 2010 17:15:25 +0000 (19:15 +0200)
From-SVN: r167860

gcc/fortran/ChangeLog
gcc/fortran/trans.c

index fd635e0fa282fc505d51148905a758cf2773dd08..751bd5aee7c9b156a37c0228f26b8111a2de9134 100644 (file)
@@ -1,3 +1,10 @@
+2010-12-15  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       PR fortran/28105
+       * trans.c (gfc_call_malloc): Improve comment.
+       (gfc_allocate_with_status): Remove size < 0 check.
+       (gfc_call_realloc): Likewise.
+
 2010-12-14  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/46937
index b84029bfd5df38835561359d09fff4f128fc753a..f3914a1020970f7dffda3668ce5bf8b5128cdbcb 100644 (file)
@@ -519,7 +519,7 @@ gfc_trans_runtime_check (bool error, bool once, tree cond, stmtblock_t * pblock,
 
 
 /* Call malloc to allocate size bytes of memory, with special conditions:
-      + if size <= 0, return a malloced area of size 1,
+      + if size == 0, return a malloced area of size 1,
       + if malloc returns NULL, issue a runtime error.  */
 tree
 gfc_call_malloc (stmtblock_t * block, tree type, tree size)
@@ -584,37 +584,21 @@ gfc_call_malloc (stmtblock_t * block, tree type, tree size)
       if (stat)
        *stat = 0;
 
-      // The only time this can happen is the size wraps around.
-      if (size < 0)
+      newmem = malloc (MAX (size, 1));
+      if (newmem == NULL)
       {
-       if (stat)
-       {
-         *stat = LIBERROR_ALLOCATION;
-         newmem = NULL;
-       }
-       else
-         runtime_error ("Attempt to allocate negative amount of memory. "
-                        "Possible integer overflow");
-      }
-      else
-      {
-       newmem = malloc (MAX (size, 1));
-       if (newmem == NULL)
-       {
-         if (stat)
-           *stat = LIBERROR_ALLOCATION;
-         else
-           runtime_error ("Out of memory");
-       }
+        if (stat)
+          *stat = LIBERROR_ALLOCATION;
+        else
+         runtime_error ("Out of memory");
       }
-
       return newmem;
     }  */
 tree
 gfc_allocate_with_status (stmtblock_t * block, tree size, tree status)
 {
   stmtblock_t alloc_block;
-  tree res, tmp, error, msg, cond;
+  tree res, tmp, msg, cond;
   tree status_type = status ? TREE_TYPE (TREE_TYPE (status)) : NULL_TREE;
 
   /* Evaluate size only once, and make sure it has the right type.  */
@@ -640,32 +624,6 @@ gfc_allocate_with_status (stmtblock_t * block, tree size, tree status)
       gfc_add_expr_to_block (block, tmp);
     }
 
-  /* Generate the block of code handling (size < 0).  */
-  msg = gfc_build_addr_expr (pchar_type_node, gfc_build_localized_cstring_const
-                       ("Attempt to allocate negative amount of memory. "
-                        "Possible integer overflow"));
-  error = build_call_expr_loc (input_location,
-                          gfor_fndecl_runtime_error, 1, msg);
-
-  if (status != NULL_TREE && !integer_zerop (status))
-    {
-      /* Set the status variable if it's present.  */
-      stmtblock_t set_status_block;
-
-      gfc_start_block (&set_status_block);
-      gfc_add_modify (&set_status_block,
-                     fold_build1_loc (input_location, INDIRECT_REF,
-                                      status_type, status),
-                          build_int_cst (status_type, LIBERROR_ALLOCATION));
-      gfc_add_modify (&set_status_block, res,
-                          build_int_cst (prvoid_type_node, 0));
-
-      tmp = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
-                            status, build_int_cst (TREE_TYPE (status), 0));
-      error = fold_build3_loc (input_location, COND_EXPR, void_type_node, tmp,
-                              error, gfc_finish_block (&set_status_block));
-    }
-
   /* The allocation itself.  */
   gfc_start_block (&alloc_block);
   gfc_add_modify (&alloc_block, res,
@@ -703,12 +661,7 @@ gfc_allocate_with_status (stmtblock_t * block, tree size, tree status)
                                          build_int_cst (prvoid_type_node, 0)),
                         tmp, build_empty_stmt (input_location));
   gfc_add_expr_to_block (&alloc_block, tmp);
-
-  cond = fold_build2_loc (input_location, LT_EXPR, boolean_type_node, size,
-                         build_int_cst (TREE_TYPE (size), 0));
-  tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond, error,
-                        gfc_finish_block (&alloc_block));
-  gfc_add_expr_to_block (block, tmp);
+  gfc_add_expr_to_block (block, gfc_finish_block (&alloc_block));
 
   return res;
 }
@@ -1048,8 +1001,6 @@ gfc_deallocate_scalar_with_status (tree pointer, tree status, bool can_fail,
 void *
 internal_realloc (void *mem, size_t size)
 {
-  if (size < 0)
-    runtime_error ("Attempt to allocate a negative amount of memory.");
   res = realloc (mem, size);
   if (!res && size != 0)
     _gfortran_os_error ("Out of memory");
@@ -1062,7 +1013,7 @@ internal_realloc (void *mem, size_t size)
 tree
 gfc_call_realloc (stmtblock_t * block, tree mem, tree size)
 {
-  tree msg, res, negative, nonzero, zero, null_result, tmp;
+  tree msg, res, nonzero, zero, null_result, tmp;
   tree type = TREE_TYPE (mem);
 
   size = gfc_evaluate_now (size, block);
@@ -1073,17 +1024,6 @@ gfc_call_realloc (stmtblock_t * block, tree mem, tree size)
   /* Create a variable to hold the result.  */
   res = gfc_create_var (type, NULL);
 
-  /* size < 0 ?  */
-  negative = fold_build2_loc (input_location, LT_EXPR, boolean_type_node, size,
-                             build_int_cst (size_type_node, 0));
-  msg = gfc_build_addr_expr (pchar_type_node, gfc_build_localized_cstring_const
-      ("Attempt to allocate a negative amount of memory."));
-  tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, negative,
-                        build_call_expr_loc (input_location,
-                                           gfor_fndecl_runtime_error, 1, msg),
-                        build_empty_stmt (input_location));
-  gfc_add_expr_to_block (block, tmp);
-
   /* Call realloc and check the result.  */
   tmp = build_call_expr_loc (input_location,
                         built_in_decls[BUILT_IN_REALLOC], 2,