bug-prolog
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

possible memory leak in Stream Handling


From: Mario Frank
Subject: possible memory leak in Stream Handling
Date: Wed, 05 Sep 2012 21:13:45 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Dear GProlog-implementors,

I am using GNU Prolog in combination with c++ (and compilation via gplc).
Specifically, I call Prolog predicates by c++ to make an unifikation of
two Terms and some other stuff.
Since I don't know the structure of the two terms (arities of embedded
Functions, etc.)
I Transform them in c++ with Pl_Mk_Chars and reconstruct the terms in
Prolog via
open_input_chars_stream, read_term,close_input_chars_stream.
In another used predicate, I transform a List to a String via atom_stream.

I tested my System for memory leaks and found a lot leaks which seem to
originate in GNU Prolog.
I also tried using the prolog Predicates in the GNU Prolog interpreter.
The leak is found there, too.
So it can not originate in my c++-code.

I start the Prolog Engine once via Pl_Start_Prolog and stop it via
Pl_Stop_Prolog.

Here is a snippet of the valgrind-output :

==4182== 571,649 bytes in 3,572 blocks are still reachable in loss
record 2,008 of 2,008
==4182==    at 0x4C836CD: malloc (in
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4182==    by 0x593F801: strdup (strdup.c:43)
==4182==    by 0x4A7F40: Pl_Strdup_Check (misc.c:148)
==4182==    by 0x4ACFBD: Pl_Create_Allocate_Atom (atom.c:248)
==4182==    by 0x44BC20: Pl_Un_String_Check (c_supp.c:1941)
==4182==    by 0x48045A: Pl_Close_Output_Term_Stream_2 (stream_c.c:1503)
==4182==    by 0x47C1C5: ??? (in
/home/eladrion/ATP/Templar/build/templar.bin)
==4182==    by 0x4A96F2: Call_Next (engine.c:449)
==4182==    by 0x4A9501: Pl_Call_Prolog (engine.c:352)
==4182==    by 0x44CB23: Pl_Query_Call (foreign_supp.c:323)

This is the c++-code which calls the predicate:

    Pl_Query_Begin (PL_TRUE);
    PlTerm arg[2];
    arg[0] = Pl_Mk_Chars(goal->c_str());
    arg[1] = Pl_Mk_Variable();
   
    int result = Pl_Query_Call(Pl_Find_Atom("parseAx"), 2, arg);
    char * term;
    if (result){
        term = Pl_Rd_String(arg[1]);
        if (term == NULL){
          Pl_Query_End(0);
          return 1;
        }
        answer->append(std::string(term));
       
        Pl_Query_End(0);
        return 0;
       
    }
    Pl_Query_End(0);
    return 1;

Finally, this are the data conversion predicates I use:

%%
% Transforms a String (Chars stream) to a Prolog Term
% templarStringToTerm(+String,-Term).
%%
templarStringToTerm(String,Term) :-
    open_input_chars_stream(String, Stream),
read_term(Stream,Term,[end_of_term(dot)]),
    close_input_chars_stream(Stream),!.

%%
% Transforms a Prolog Object (List, Term,...) to a String
% templarXToString(+Something,-String).
%%
templarXToString(Something,String) :-
    open_output_atom_stream(Stream), writeq(Stream,Something),
    flush_output(Stream), close_output_atom_stream(Stream,String),!.

I already searched for Information in Mailing lists but did not find
answers.

Also, I viewed the GProlog-Code and found some suspicious lines here:
Pl_Close_Output_Term_Stream_2 (stream_c.c:1503)

The char * str is created. If the Unification (Pl_Un_Chars....) fails,
the function returns false but
does not free the memory.

If this is really a bug, could you send me the spots which I need to fix
on my system?

I use gprolog 1.4.1 (1.4.0 has the same leak) and g++ 4.6.3 on Ubuntu
12.04 64 bit.

Cheers, Mario
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://www.enigmail.net/

iQEcBAEBAgAGBQJQR6RkAAoJEDnmHcItIfWElw4IAOVLMIpWgXRgnvvbKZHXsi9r
57+6UMXoA5KoS9NNV3Aa8qxfVAtCbuQ0RLnOGlnlnyBTrsTr9eNk2FBgAfSpInoe
iPlsHKHo8SYGKWEb7uso4XsdxlS3gGEqV7SkDlS3YPAkEakNbteGyhQ0heDlYH14
qLPh0VWuJXwN+/9bR6rNOC7LQiTBGbfV0efSENd0Ap+67Qg3gGH7e+5u2eB5n3Io
WDSp8Jv8nTLtSEWZpxoc/ZlLrErV4KTHZVaOLxMnE/eRmgVmWEuu2WZwwBWxpd5a
YFhH4SRxtDs4gI2n61edEVGqnh6lIrVhHYtCBYco9cfgO4ug1nyMqFbR3fcW4Qg=
=JQbI
-----END PGP SIGNATURE-----




reply via email to

[Prev in Thread] Current Thread [Next in Thread]