[Bug c/93561] New: [bounds checking] memory overflow for spill_for
zhongyunde at huawei dot com
gcc-bugzilla@gcc.gnu.org
Tue Feb 4 08:08:00 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93561
Bug ID: 93561
Summary: [bounds checking] memory overflow for spill_for
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: zhongyunde at huawei dot com
Target Milestone: ---
In funcion spill_for, there is following code:
mode = PSEUDO_REGNO_MODE (regno);
...
for (i = 0; i < rclass_size; i++)
{
hard_regno = ira_class_hard_regs[rclass][i];
bitmap_clear (&spill_pseudos_bitmap);
for (j = hard_regno_nregs[hard_regno][mode] - 1; j >= 0; j--)
{
if (try_hard_reg_pseudos_check[hard_regno + j] != curr_pseudo_check)
continue;
lra_assert (!bitmap_empty_p (&try_hard_reg_pseudos[hard_regno + j]));
bitmap_ior_into (&spill_pseudos_bitmap,
&try_hard_reg_pseudos[hard_regno + j]);
}
/* Spill pseudos. */
In our DSP chip, we have 32 1-bit hard regs(every register has only 1 -bit),
used to match data type similar as bool. so it need 64 such registers for
DImode reg to spill, and hard_regno_nregs[hard_regno][DImode] return 64, and
the value hard_regno + j larger than FIRST_PSEUDO_REGISTER bring into the array
accessing of memory overflow.
should we add the following code to avoid such issue ?
for (j = hard_regno_nregs[hard_regno][mode] - 1; j >= 0; j--)
{
+++ if ((hard_regno + j) >= FIRST_PSEUDO_REGISTER)
+++ break;
if (try_hard_reg_pseudos_check[hard_regno + j] != curr_pseudo_check)
continue;
lra_assert (!bitmap_empty_p (&try_hard_reg_pseudos[hard_regno + j]));
bitmap_ior_into (&spill_pseudos_bitmap,
&try_hard_reg_pseudos[hard_regno + j]);
}
More information about the Gcc-bugs
mailing list