diff mbox

[fortran] Fix memory leak in arith_power()

Message ID D60CD2AE-FF68-493B-BE06-431A10BF24D4@gmail.com
State New
Headers show

Commit Message

FX Coudert March 12, 2011, 1:30 p.m. UTC
While looking at the use of gfc_free() in the front-end when discussing its removal, I noticed one instance where gfc_free_expr() should be used instead. The patch that fixes it is:


2011-03-12  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>

	* arith.c (arith_power): Plug memory leak.




Without it, the following testcase :

  print *, (-2.0)**(1.3)
  end

leaks memory, as evidenced by valgrind:

==26601== 16 bytes in 1 blocks are definitely lost in loss record 6 of 287
==26601==    at 0x4A05E1C: malloc (vg_replace_malloc.c:195)
==26601==    by 0xD86668: __gmp_default_allocate (in /large/gcc/ibin/gcc/f951)
==26601==    by 0xD4912C: mpfr_init2 (in /large/gcc/ibin/gcc/f951)
==26601==    by 0x4B48D0: gfc_get_constant_expr (expr.c:165)
==26601==    by 0x48FEFC: arith_power (arith.c:791)
==26601==    by 0x48EB73: reduce_binary (arith.c:1387)
==26601==    by 0x48EF2D: eval_intrinsic (arith.c:1568)
==26601==    by 0x48F5C7: eval_intrinsic_f3 (arith.c:1701)
==26601==    by 0x4B94C5: gfc_simplify_expr (expr.c:1048)
==26601==    by 0x501E2A: gfc_resolve_expr (resolve.c:3977)
==26601==    by 0x50BA26: resolve_code (resolve.c:8997)
==26601==    by 0x50CFDB: gfc_resolve_blocks (resolve.c:8725)


With the patch, the leak disappears. It was regtested on x86_64-linux. OK to commit to trunk?

FX

Comments

Tobias Burnus March 12, 2011, 8:05 p.m. UTC | #1
FX wrote:
> While looking at the use of gfc_free() in the front-end when discussing its removal, I noticed one instance where gfc_free_expr() should be used instead. The patch that fixes it is:
OK. Thanks for the patch!

Tobias

> 2011-03-12  Francois-Xavier Coudert<fxcoudert@gcc.gnu.org>
>
> 	* arith.c (arith_power): Plug memory leak.
diff mbox

Patch

Index: arith.c
===================================================================
--- arith.c	(revision 170612)
+++ arith.c	(working copy)
@@ -912,7 +912,7 @@ 
 	{
 	  gfc_error ("Raising a negative REAL at %L to "
 		     "a REAL power is prohibited", &op1->where);
-	  gfc_free (result);
+	  gfc_free_expr (result);
 	  return ARITH_PROHIBIT;
 	}