PR 28105 Remove size<0 checks before calling malloc/realloc

From-SVN: r167860
This commit is contained in:
Janne Blomqvist 2010-12-15 19:15:25 +02:00
parent be3ea0c8c9
commit da17cbb79b
2 changed files with 17 additions and 70 deletions

View 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> 2010-12-14 Tobias Burnus <burnus@net-b.de>
PR fortran/46937 PR fortran/46937

View 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: /* 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. */ + if malloc returns NULL, issue a runtime error. */
tree tree
gfc_call_malloc (stmtblock_t * block, tree type, tree size) 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) if (stat)
*stat = 0; *stat = 0;
// The only time this can happen is the size wraps around. newmem = malloc (MAX (size, 1));
if (size < 0) if (newmem == NULL)
{ {
if (stat) if (stat)
{ *stat = LIBERROR_ALLOCATION;
*stat = LIBERROR_ALLOCATION; else
newmem = NULL; runtime_error ("Out of memory");
}
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");
}
}
return newmem; return newmem;
} */ } */
tree tree
gfc_allocate_with_status (stmtblock_t * block, tree size, tree status) gfc_allocate_with_status (stmtblock_t * block, tree size, tree status)
{ {
stmtblock_t alloc_block; 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; tree status_type = status ? TREE_TYPE (TREE_TYPE (status)) : NULL_TREE;
/* Evaluate size only once, and make sure it has the right type. */ /* 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); 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. */ /* The allocation itself. */
gfc_start_block (&alloc_block); gfc_start_block (&alloc_block);
gfc_add_modify (&alloc_block, res, 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)), build_int_cst (prvoid_type_node, 0)),
tmp, build_empty_stmt (input_location)); tmp, build_empty_stmt (input_location));
gfc_add_expr_to_block (&alloc_block, tmp); gfc_add_expr_to_block (&alloc_block, tmp);
gfc_add_expr_to_block (block, gfc_finish_block (&alloc_block));
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);
return res; return res;
} }
@ -1048,8 +1001,6 @@ gfc_deallocate_scalar_with_status (tree pointer, tree status, bool can_fail,
void * void *
internal_realloc (void *mem, size_t size) internal_realloc (void *mem, size_t size)
{ {
if (size < 0)
runtime_error ("Attempt to allocate a negative amount of memory.");
res = realloc (mem, size); res = realloc (mem, size);
if (!res && size != 0) if (!res && size != 0)
_gfortran_os_error ("Out of memory"); _gfortran_os_error ("Out of memory");
@ -1062,7 +1013,7 @@ internal_realloc (void *mem, size_t size)
tree tree
gfc_call_realloc (stmtblock_t * block, tree mem, tree size) 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); tree type = TREE_TYPE (mem);
size = gfc_evaluate_now (size, block); 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. */ /* Create a variable to hold the result. */
res = gfc_create_var (type, NULL); 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. */ /* Call realloc and check the result. */
tmp = build_call_expr_loc (input_location, tmp = build_call_expr_loc (input_location,
built_in_decls[BUILT_IN_REALLOC], 2, built_in_decls[BUILT_IN_REALLOC], 2,