This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/61281] Memory corruption on assigning a polymorphic variable to a non-polymorphic one
- From: "dominiq at lps dot ens.fr" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sun, 01 Jun 2014 09:44:35 +0000
- Subject: [Bug fortran/61281] Memory corruption on assigning a polymorphic variable to a non-polymorphic one
- Auto-submitted: auto-generated
- References: <bug-61281-4 at http dot gcc dot gnu dot org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61281
Dominique d'Humieres <dominiq at lps dot ens.fr> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |burnus at gcc dot gnu.org,
| |janus at gcc dot gnu.org
--- Comment #4 from Dominique d'Humieres <dominiq at lps dot ens.fr> ---
Valgrind nor -fsanitize=address don't report any error.
The "memory corruption" is not limited to character variable and it occurs
already in map, i.e., give_raise(nrl%list) does not return 'rob'.
The error "Can't convert CLASS(employees) to TYPE(employees) at (1)" may have
been removed by r201328.
The original dump for type is:
map ()
{
nrl.list = give_raise (&nrl.list);
}
give_raise (struct employees & restrict e)
{
struct employees __result_give_raise;
{
struct employees employees.0;
(MEM[(c_char * {ref-all})&employees.0] = MEM[(c_char * {ref-all})"rob"];,
(void *) &employees.0.name;);
__result_give_raise = employees.0;
}
__result_give_raise = *e;
return __result_give_raise;
}
MAIN__ ()
{
static struct companies nrl = {.list={.name="rob"}};
static struct employees give_raise (struct employees & restrict);
static void map (void);
and with class it is:
__copy_MAIN___Employees (struct employees & restrict src, struct employees &
restrict dst)
{
*dst = *src;
}
map ()
{
{
struct __class_MAIN___Employees_t class.0;
class.0._vptr = (struct __vtype_MAIN___Employees * {ref-all})
&__vtab_MAIN___Employees;
class.0._data = &nrl.list;
nrl.list = give_raise (&class.0);
}
}
give_raise (struct __class_MAIN___Employees_t & restrict e)
{
struct employees __result_give_raise;
{
struct employees employees.1;
(MEM[(c_char * {ref-all})&employees.1] = MEM[(c_char * {ref-all})"rob"];,
(void *) &employees.1.name;);
__result_give_raise = employees.1;
}
__result_give_raise = VIEW_CONVERT_EXPR<struct employees>(*e);
return __result_give_raise;
}
MAIN__ ()
{
static struct __vtype_MAIN___Employees __vtab_MAIN___Employees =
{._hash=65382630, ._size=3, ._extends=0B,
._def_init=&__def_init_MAIN___Employees, ._copy=__copy_MAIN___Employees,
._final=0B};
static struct employees __def_init_MAIN___Employees = {.name="rob"};
static struct companies nrl = {.list={.name="rob"}};
static struct employees give_raise (struct __class_MAIN___Employees_t &
restrict);
static void map (void);
static void __copy_MAIN___Employees (struct employees & restrict, struct
employees & restrict);
...