diff mbox

[Fortran,OOP] PR 64230: [4.9/5 Regression] Invalid memory reference in a compiler-generated finalizer for allocatable component

Message ID CAKwh3qipOj3hjqLpQdw7_HZx_QOZF9pyDU91ZyEpp_FhjTxJQg@mail.gmail.com
State New
Headers show

Commit Message

Janus Weil Jan. 19, 2015, 2:41 p.m. UTC
Hi,

this is a second patch dealing with finalization-related regressions,
after the one I submitted yesterday
(https://gcc.gnu.org/ml/fortran/2015-01/msg00109.html), which btw is
also still waiting for review ...

This patch fixes an invalid memory reference inside the finalizer
routine (at runtime), which apparently was caused by dereferencing a
pointer without checking if it's NULL. I simply insert a call to
ASSOCIATED.

I also rename two different runtime variables, which were both called
'ptr', to 'ptr1' and 'ptr2', just to make it easier to distinguish
them in the dump.

I also have the feeling the a lot of what is being done in
generate_finalization_wrapper and finalize_component (including my
changes) is a bit laborious. Some helper functions might be useful to
make all that code generation a bit more readable and less verbose. I
may attack this in a follow-up patch.

This one regtests cleanly on x86_64-unknown-linux-gnu. Ok for trunk and 4.9?

Cheers,
Janus



2015-01-19  Janus Weil  <janus@gcc.gnu.org>

    PR fortran/64230
    * class.c (finalize_component): New argument 'sub_ns'. Insert code to
    check if 'expr' is associated.
    (generate_finalization_wrapper): Rename 'ptr' symbols to 'ptr1' and
    'ptr2'. Pass 'sub_ns' to finalize_component.

2015-01-19  Janus Weil  <janus@gcc.gnu.org>

    PR fortran/64230
    * gfortran.dg/class_allocate_18.f90: Extended.

Comments

Janus Weil Jan. 24, 2015, 10:15 a.m. UTC | #1
ping!



2015-01-19 15:41 GMT+01:00 Janus Weil <janus@gcc.gnu.org>:
> Hi,
>
> this is a second patch dealing with finalization-related regressions,
> after the one I submitted yesterday
> (https://gcc.gnu.org/ml/fortran/2015-01/msg00109.html), which btw is
> also still waiting for review ...
>
> This patch fixes an invalid memory reference inside the finalizer
> routine (at runtime), which apparently was caused by dereferencing a
> pointer without checking if it's NULL. I simply insert a call to
> ASSOCIATED.
>
> I also rename two different runtime variables, which were both called
> 'ptr', to 'ptr1' and 'ptr2', just to make it easier to distinguish
> them in the dump.
>
> I also have the feeling the a lot of what is being done in
> generate_finalization_wrapper and finalize_component (including my
> changes) is a bit laborious. Some helper functions might be useful to
> make all that code generation a bit more readable and less verbose. I
> may attack this in a follow-up patch.
>
> This one regtests cleanly on x86_64-unknown-linux-gnu. Ok for trunk and 4.9?
>
> Cheers,
> Janus
>
>
>
> 2015-01-19  Janus Weil  <janus@gcc.gnu.org>
>
>     PR fortran/64230
>     * class.c (finalize_component): New argument 'sub_ns'. Insert code to
>     check if 'expr' is associated.
>     (generate_finalization_wrapper): Rename 'ptr' symbols to 'ptr1' and
>     'ptr2'. Pass 'sub_ns' to finalize_component.
>
> 2015-01-19  Janus Weil  <janus@gcc.gnu.org>
>
>     PR fortran/64230
>     * gfortran.dg/class_allocate_18.f90: Extended.
Tobias Burnus Jan. 24, 2015, 5:18 p.m. UTC | #2
Janus Weil wrote:
> this is a second patch dealing with finalization-related regressions,
> [...]
> This patch fixes an invalid memory reference inside the finalizer
> routine (at runtime), which apparently was caused by dereferencing a
> pointer without checking if it's NULL. I simply insert a call to
> ASSOCIATED.
> [...]
>
> This one regtests cleanly on x86_64-unknown-linux-gnu. Ok for trunk and 4.9?

OK. Thanks for the patch!

Tobias

> 2015-01-19  Janus Weil  <janus@gcc.gnu.org>
>
>      PR fortran/64230
>      * class.c (finalize_component): New argument 'sub_ns'. Insert code to
>      check if 'expr' is associated.
>      (generate_finalization_wrapper): Rename 'ptr' symbols to 'ptr1' and
>      'ptr2'. Pass 'sub_ns' to finalize_component.
>
> 2015-01-19  Janus Weil  <janus@gcc.gnu.org>
>
>      PR fortran/64230
>      * gfortran.dg/class_allocate_18.f90: Extended.
Janus Weil Jan. 26, 2015, 3:57 p.m. UTC | #3
2015-01-24 18:18 GMT+01:00 Tobias Burnus <burnus@net-b.de>:
>> this is a second patch dealing with finalization-related regressions,
>> [...]
>> This patch fixes an invalid memory reference inside the finalizer
>> routine (at runtime), which apparently was caused by dereferencing a
>> pointer without checking if it's NULL. I simply insert a call to
>> ASSOCIATED.
>> [...]
>>
>> This one regtests cleanly on x86_64-unknown-linux-gnu. Ok for trunk and
>> 4.9?
>
>
> OK. Thanks for the patch!

Thanks for the review, Tobias. Committed to trunk as r220125. Will
backport to 4.9 soon.

Cheers,
Janus
Paul Richard Thomas Jan. 26, 2015, 9:47 p.m. UTC | #4
Hi Janus,

The testcase has a dependence on libubsan.so, which my LD_LIBRARY_PATH
does not seem to be able to resolve. It therefore fails in the
regression test. When I point to ~/lib64, I get the message:

/svn/trunk/gcc/testsuite/gfortran.dg/class_allocate_18.f90:8: runtime
error: signed integer overflow: 214358001592 * 214358001560 cannot be
represented in type 'integer(kind=8)'

Cheers

Paul

On 26 January 2015 at 15:57, Janus Weil <janus@gcc.gnu.org> wrote:
> 2015-01-24 18:18 GMT+01:00 Tobias Burnus <burnus@net-b.de>:
>>> this is a second patch dealing with finalization-related regressions,
>>> [...]
>>> This patch fixes an invalid memory reference inside the finalizer
>>> routine (at runtime), which apparently was caused by dereferencing a
>>> pointer without checking if it's NULL. I simply insert a call to
>>> ASSOCIATED.
>>> [...]
>>>
>>> This one regtests cleanly on x86_64-unknown-linux-gnu. Ok for trunk and
>>> 4.9?
>>
>>
>> OK. Thanks for the patch!
>
> Thanks for the review, Tobias. Committed to trunk as r220125. Will
> backport to 4.9 soon.
>
> Cheers,
> Janus
Janus Weil Jan. 26, 2015, 10:20 p.m. UTC | #5
Hi Paul,

> The testcase has a dependence on libubsan.so, which my LD_LIBRARY_PATH
> does not seem to be able to resolve. It therefore fails in the
> regression test. When I point to ~/lib64, I get the message:
>
> /svn/trunk/gcc/testsuite/gfortran.dg/class_allocate_18.f90:8: runtime
> error: signed integer overflow: 214358001592 * 214358001560 cannot be
> represented in type 'integer(kind=8)'

of course I tested it but did not see any problem on my machine
(Ubuntu 14.10, x86_64-unknown-linux-gnu).

In fact class_allocate_18.f90 seems to be the only testcase in
gfortran.dg/ which uses any -fsanitize options, but there are plenty
in other sections (mostly c-c++-common/ubsan/ and g++.dg/ubsan/).

Could it be a problem with your local setup or a dejagnu issue that
only applears on certain platforms? I have no idea how to fix this. Do
you have any suggestion?

Cheers,
Janus



> On 26 January 2015 at 15:57, Janus Weil <janus@gcc.gnu.org> wrote:
>> 2015-01-24 18:18 GMT+01:00 Tobias Burnus <burnus@net-b.de>:
>>>> this is a second patch dealing with finalization-related regressions,
>>>> [...]
>>>> This patch fixes an invalid memory reference inside the finalizer
>>>> routine (at runtime), which apparently was caused by dereferencing a
>>>> pointer without checking if it's NULL. I simply insert a call to
>>>> ASSOCIATED.
>>>> [...]
>>>>
>>>> This one regtests cleanly on x86_64-unknown-linux-gnu. Ok for trunk and
>>>> 4.9?
>>>
>>>
>>> OK. Thanks for the patch!
>>
>> Thanks for the review, Tobias. Committed to trunk as r220125. Will
>> backport to 4.9 soon.
>>
>> Cheers,
>> Janus
>
>
>
> --
> Outside of a dog, a book is a man's best friend. Inside of a dog it's
> too dark to read.
>
> Groucho Marx
Paul Richard Thomas Jan. 27, 2015, 5:18 a.m. UTC | #6
Dear Janus,

I know somewhat less than nothing about such matters. I suggest that
you contact the authors of the testcases that use libubsan that you
mention.

Sorry

Paul

On 26 January 2015 at 22:20, Janus Weil <janus@gcc.gnu.org> wrote:
> Hi Paul,
>
>> The testcase has a dependence on libubsan.so, which my LD_LIBRARY_PATH
>> does not seem to be able to resolve. It therefore fails in the
>> regression test. When I point to ~/lib64, I get the message:
>>
>> /svn/trunk/gcc/testsuite/gfortran.dg/class_allocate_18.f90:8: runtime
>> error: signed integer overflow: 214358001592 * 214358001560 cannot be
>> represented in type 'integer(kind=8)'
>
> of course I tested it but did not see any problem on my machine
> (Ubuntu 14.10, x86_64-unknown-linux-gnu).
>
> In fact class_allocate_18.f90 seems to be the only testcase in
> gfortran.dg/ which uses any -fsanitize options, but there are plenty
> in other sections (mostly c-c++-common/ubsan/ and g++.dg/ubsan/).
>
> Could it be a problem with your local setup or a dejagnu issue that
> only applears on certain platforms? I have no idea how to fix this. Do
> you have any suggestion?
>
> Cheers,
> Janus
>
>
>
>> On 26 January 2015 at 15:57, Janus Weil <janus@gcc.gnu.org> wrote:
>>> 2015-01-24 18:18 GMT+01:00 Tobias Burnus <burnus@net-b.de>:
>>>>> this is a second patch dealing with finalization-related regressions,
>>>>> [...]
>>>>> This patch fixes an invalid memory reference inside the finalizer
>>>>> routine (at runtime), which apparently was caused by dereferencing a
>>>>> pointer without checking if it's NULL. I simply insert a call to
>>>>> ASSOCIATED.
>>>>> [...]
>>>>>
>>>>> This one regtests cleanly on x86_64-unknown-linux-gnu. Ok for trunk and
>>>>> 4.9?
>>>>
>>>>
>>>> OK. Thanks for the patch!
>>>
>>> Thanks for the review, Tobias. Committed to trunk as r220125. Will
>>> backport to 4.9 soon.
>>>
>>> Cheers,
>>> Janus
>>
>>
>>
>> --
>> Outside of a dog, a book is a man's best friend. Inside of a dog it's
>> too dark to read.
>>
>> Groucho Marx
Andreas Schwab Jan. 27, 2015, 9:24 a.m. UTC | #7
Janus Weil <janus@gcc.gnu.org> writes:

> 2015-01-19  Janus Weil  <janus@gcc.gnu.org>
>
>     PR fortran/64230
>     * gfortran.dg/class_allocate_18.f90: Extended.

FAIL: gfortran.dg/class_allocate_18.f90   -O0  (test for excess errors)
Excess errors:
/usr/ia64-suse-linux/bin/ld: cannot find -lubsan

Andreas.
Jakub Jelinek Jan. 27, 2015, 9:30 a.m. UTC | #8
On Tue, Jan 27, 2015 at 10:24:47AM +0100, Andreas Schwab wrote:
> Janus Weil <janus@gcc.gnu.org> writes:
> 
> > 2015-01-19  Janus Weil  <janus@gcc.gnu.org>
> >
> >     PR fortran/64230
> >     * gfortran.dg/class_allocate_18.f90: Extended.
> 
> FAIL: gfortran.dg/class_allocate_18.f90   -O0  (test for excess errors)
> Excess errors:
> /usr/ia64-suse-linux/bin/ld: cannot find -lubsan

Yeah, if you want to add ubsan tests, you need to add gfortran.dg/ubsan/
directory and hack up ubsan.exp in there, from say gcc.dg/ubsan/ubsan.exp
and gfortran.dg/dg.exp.

	Jakub
diff mbox

Patch

Index: gcc/fortran/class.c
===================================================================
--- gcc/fortran/class.c	(Revision 219840)
+++ gcc/fortran/class.c	(Arbeitskopie)
@@ -881,7 +881,8 @@  comp_is_finalizable (gfc_component *comp)
 
 static void
 finalize_component (gfc_expr *expr, gfc_symbol *derived, gfc_component *comp,
-		    gfc_symbol *stat, gfc_symbol *fini_coarray, gfc_code **code)
+		    gfc_symbol *stat, gfc_symbol *fini_coarray, gfc_code **code,
+		    gfc_namespace *sub_ns)
 {
   gfc_expr *e;
   gfc_ref *ref;
@@ -950,15 +951,32 @@  finalize_component (gfc_expr *expr, gfc_symbol *de
       dealloc->ext.alloc.list->expr = e;
       dealloc->expr1 = gfc_lval_expr_from_sym (stat);
 
+      gfc_code *cond = gfc_get_code (EXEC_IF);
+      cond->block = gfc_get_code (EXEC_IF);
+      cond->block->expr1 = gfc_get_expr ();
+      cond->block->expr1->expr_type = EXPR_FUNCTION;
+      gfc_get_sym_tree ("associated", sub_ns, &cond->block->expr1->symtree, false);
+      cond->block->expr1->symtree->n.sym->attr.flavor = FL_PROCEDURE;
+      cond->block->expr1->symtree->n.sym->attr.intrinsic = 1;
+      cond->block->expr1->symtree->n.sym->result = cond->block->expr1->symtree->n.sym;
+      gfc_commit_symbol (cond->block->expr1->symtree->n.sym);
+      cond->block->expr1->ts.type = BT_LOGICAL;
+      cond->block->expr1->ts.kind = gfc_default_logical_kind;
+      cond->block->expr1->value.function.isym = gfc_intrinsic_function_by_id (GFC_ISYM_ASSOCIATED);
+      cond->block->expr1->value.function.actual = gfc_get_actual_arglist ();
+      cond->block->expr1->value.function.actual->expr = gfc_copy_expr (expr);
+      cond->block->expr1->value.function.actual->next = gfc_get_actual_arglist ();
+      cond->block->next = dealloc;
+
       if (block)
-	block->next = dealloc;
+	block->next = cond;
       else if (*code)
 	{
-	  (*code)->next = dealloc;
+	  (*code)->next = cond;
 	  (*code) = (*code)->next;
 	}
       else
-	(*code) = dealloc;
+	(*code) = cond;
     }
   else if (comp->ts.type == BT_DERIVED
 	    && comp->ts.u.derived->f2k_derived
@@ -994,7 +1012,8 @@  finalize_component (gfc_expr *expr, gfc_symbol *de
       gfc_component *c;
 
       for (c = comp->ts.u.derived->components; c; c = c->next)
-	finalize_component (e, comp->ts.u.derived, c, stat, fini_coarray, code);
+	finalize_component (e, comp->ts.u.derived, c, stat, fini_coarray, code,
+			    sub_ns);
       gfc_free_expr (e);
     }
 }
@@ -1927,7 +1946,7 @@  generate_finalization_wrapper (gfc_symbol *derived
     {
       gfc_finalizer *fini, *fini_elem = NULL;
 
-      gfc_get_symbol ("ptr", sub_ns, &ptr);
+      gfc_get_symbol ("ptr1", sub_ns, &ptr);
       ptr->ts.type = BT_DERIVED;
       ptr->ts.u.derived = derived;
       ptr->attr.flavor = FL_VARIABLE;
@@ -2051,7 +2070,7 @@  generate_finalization_wrapper (gfc_symbol *derived
 
       if (!ptr)
 	{
-	  gfc_get_symbol ("ptr", sub_ns, &ptr);
+	  gfc_get_symbol ("ptr2", sub_ns, &ptr);
 	  ptr->ts.type = BT_DERIVED;
 	  ptr->ts.u.derived = derived;
 	  ptr->attr.flavor = FL_VARIABLE;
@@ -2100,7 +2119,7 @@  generate_finalization_wrapper (gfc_symbol *derived
 	    continue;
 
 	  finalize_component (gfc_lval_expr_from_sym (ptr), derived, comp,
-			      stat, fini_coarray, &block);
+			      stat, fini_coarray, &block, sub_ns);
 	  if (!last_code->block->next)
 	    last_code->block->next = block;
 	}