Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
da17cbb7
Commit
da17cbb7
authored
Dec 15, 2010
by
Janne Blomqvist
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
PR 28105 Remove size<0 checks before calling malloc/realloc
From-SVN: r167860
parent
be3ea0c8
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
17 additions
and
70 deletions
+17
-70
gcc/fortran/ChangeLog
+7
-0
gcc/fortran/trans.c
+10
-70
No files found.
gcc/fortran/ChangeLog
View file @
da17cbb7
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
...
...
gcc/fortran/trans.c
View file @
da17cbb7
...
...
@@ -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
,
n
egative
,
n
onzero
,
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
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment