PR 28105 Remove size<0 checks before calling malloc/realloc
From-SVN: r167860
This commit is contained in:
parent
be3ea0c8c9
commit
da17cbb79b
@ -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
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user