[antlr-interest] Antlr C code memory leak in Antlr 3.1.1

Jim Idle jimi at temporal-wave.com
Tue Nov 11 08:52:30 PST 2008


On Tue, 2008-11-11 at 13:39 +0000, merry_winfly at hotmail.com wrote:
> 
> ==>
> Actully, I find when (lPredigestParser->free(lPredigestParser);) the adapter and vector will be freed by this free action, but at last some tokenstream didn't be freed, I don't know if my source code issue or antlr's bug.
>  
> And any one know this, pls freely tell me the reason.

Did you call free on the token stream itself? I think that this is your
issue. There is a treenode stream that you must free too. Check against
that example tree parsers, but I will look at your issue today.

Jim

>  
> Thanks a lot.
>  
> Best Regards
> Winfly Lin
> 
> 
> 
> From: merry_winfly at hotmail.com
> To: antlr-interest at antlr.org
> Date: Mon, 10 Nov 2008 13:21:04 +0000
> Subject: [antlr-interest] Antlr C code memory leak in Antlr 3.1.1
> 
> 
> 
> Hi All,
>  
> When I use the C code from antlr generator with predigest PLSQL parser  , I find it exist obvious memory leak issue.
>  
> I use valgrind  to check and the result is:
> 
>  
> valgrind --leak-check=full ./treeMemory
> 
> ==9541== Memcheck, a memory error detector.
> 
> ==9541== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
> 
> ==9541== Using LibVEX rev 1854, a library for dynamic binary translation.
> 
> ==9541== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
> 
> ==9541== Using valgrind-3.3.1, a dynamic binary instrumentation framework.
> 
> ==9541== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
> 
> ==9541== For more details, rerun with: -v
> 
> ==9541==
> ==9541==
> ==9541== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 1)
> ==9541== malloc/free: in use at exit: 8,008 bytes in 98 blocks.
> ==9541== malloc/free: 8,847 allocs, 8,749 frees, 2,202,767 bytes allocated.
> ==954 1== For counts of detected errors, rerun with: -v
> ==9541== searching for pointers to 98 not-freed blocks.
> ==9541== checked 149,260 bytes.
> ==9541==
> ==9541== 8,008 (7,560 direct, 448 indirect) bytes in 90 blocks are definitely lost in loss record 3 of 3
> ==9541==    at 0x40057C8: malloc (vg_replace_malloc.c:207)
> ==9541==    by 0x8055BFA: antlr3RewriteRuleElementStreamNewAE (antlr3rewritestreams.c:94)
> ==9541==    by 0x8055DA0: antlr3RewriteRuleTOKENStreamNewAE (antlr3rewritestreams.c:192)
> ==9541==    by 0x80B8125: select_list (PLSQLpredigestParser.c:51593)
> ==9541==    by 0x80B4E0F: select_expression (PLSQLpredigestParser.c:50283)
> ==9541==    by 0x80B3F4D: select_statement (PLSQLpredigestParser.c:49890)
> ==9541==    by 0x810C0F5: insert_command (PLSQLpredigestParser.c:83912)
> ==9541==    by 0x80B1E12: sql_command (PLSQLpredigest Parser.c:49133)
> ==9541==    by 0x80B13BE: sql_statement (PLSQLpredigestParser.c:48855)
> ==9541==    by 0x8083185: statement (PLSQLpredigestParser.c:31331)
> ==9541==    by 0x808110E: seq_of_statements (PLSQLpredigestParser.c:30542)
> ==9541==    by 0x8077D5C: start_rule (PLSQLpredigestParser.c:26944)
> ==9541==
> ==9541== LEAK SUMMARY:
> ==9541==    definitely lost: 7,560 bytes in 90 blocks.
> ==9541==    indirectly lost: 448 bytes in 8 blocks.
> ==9541==      possibly lost: 0 bytes in 0 blocks.
> ==9541==    still reachable: 0 bytes in 0 blocks.
> ==9541==         suppressed: 0 bytes in 0 blocks.
>  
> Source Code:
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> string SQL="insert into T K(a1,a2,a3) select a,b,c from t2 where a>9 union all select e,f,g from t5 where e>'winfly' ;";
>    
>  pANTLR3_INPUT_STREAM lInput=NULL;
>  pANTLR3_COMMON_TOKEN_STREAM lPredigestTokenStream=NULL;
>  pPLSQLpredigestParser lPredigestParser=NULL;
>  pPLSQLpredigestLexer lPredigestLexer=NULL;
>  lInput = antlr3NewAsciiStringInPlaceStream((pANTLR3_UINT8)SQL.c_str(), (ANTLR3_UINT64)SQL.size(), NULL);
>  if(!lInput)
>  {
>   cout<<" input error"<setUcaseLA(lInput,ANTLR3_TRUE);
>     
>  lPredigestLexer = PLSQLpredigestLexerNew(lInput);
>  if(!lPredigestLexer)
>  {
>   cout<<" lPredigestLexer error"<start_rule(lPredigestParser);
>   
>  lPredigestParser->free(lPredigestParser);
>  lPredigestTokenStream->free(lPredigestTokenStream);
>  lPredigestLexer->free(lPredigestLexer);
>  lInput->close(lInput);
>  
> 
>  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
> Actually the memory leak exist PLSQLpredigestParser_start_rule_return psr = lPredigestParser->start_rule(lPredigestParser);
>  
> I don't know why so simple code cause so obvious memory leak
> 
>  
> Could you help me to solve this? (I'm hurry for this code, thanks a lot!)
>  
> I list the information and attachment includes all code about it (C file ):
>  
> Platform: RedHat Enterprise 5 Server, virtual machine.
> GCC version: 4.1.1
> Antlr Version: 3.1.1
>  
> 
> 
> 
> I don't know if it is enough information to trace this problem, but if you want to know any more information, pls freely contact me with this E-mail (merry_winfly at hotmail.com).
>  
> 
> Thanks a lot.
>  
> 
> Best Regards
> Winfly Lin
> 
> 
> 
> 
> 
> 
> 
> 
> Get news, entertainment and everything you care about at Live.com. Check it out!
> _________________________________________________________________
> Connect to the next generation of MSN Messenger 
> http://imagine-msn.com/messenger/launch80/default.aspx?locale=en-us&source=wlmailtagline
> 
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
> 



More information about the antlr-interest mailing list