memleak fixed in functions module. 58/17158/3
Cedric Delamarre [Fri, 4 Sep 2015 07:31:52 +0000 (09:31 +0200)]
Change-Id: Ic75d2b9bc110a2581ecf4e67bc7fa6337693843f

scilab/modules/ast/src/cpp/ast/treevisitor.cpp
scilab/modules/ast/src/cpp/parse/parser.cpp
scilab/modules/core/sci_gateway/cpp/sci_macr2tree.cpp
scilab/modules/functions/sci_gateway/cpp/sci_exec.cpp
scilab/modules/functions/tests/nonreg_tests/bug_12593.tst
scilab/modules/functions/tests/nonreg_tests/bug_14025.tst
scilab/modules/functions/tests/nonreg_tests/bug_6549.tst
scilab/modules/functions/tests/nonreg_tests/bug_6550.tst
scilab/modules/io/sci_gateway/cpp/sci_genlib.cpp

index 51f950d..7872d6f 100644 (file)
@@ -31,8 +31,8 @@ void TreeVisitor::visit(const SeqExp  &e)
     int last_line = -1;
     for (auto it : e.getExps())
     {
-        int fisrt = it->getLocation().first_line;
-        while (last_line != -1 && last_line < it->getLocation().first_line)
+        int first = it->getLocation().first_line;
+        while (last_line != -1 && last_line < first)
         {
             lst->append(getEOL());
             ++last_line;
@@ -77,9 +77,7 @@ void TreeVisitor::visit(const SeqExp  &e)
             tl->append(lhs);
             lhs->killMe();
             //endsymbol
-            tmp = getVerbose(*it);
-            tl->append(tmp);
-            tmp->killMe();
+            tl->append(getVerbose(*it));
             lst->append(tl);
             tl->killMe();
         }
@@ -126,12 +124,12 @@ void TreeVisitor::visit(const BoolExp &e)
     l = createConst(exec.getResult());
 }
 
-void TreeVisitor::visit(const DollarVar &e)
+void TreeVisitor::visit(const DollarVar &/*e*/)
 {
     l = createVar(L"$");
 }
 
-void TreeVisitor::visit(const ColonVar &e)
+void TreeVisitor::visit(const ColonVar &/*e*/)
 {
     l = createVar(L":");
 }
@@ -164,9 +162,7 @@ void TreeVisitor::visit(const MatrixExp &e)
         {
             sub->append(ope);
             ope->killMe();
-            types::InternalType* tmp = new types::String(L"cc");
-            sub->append(tmp);
-            tmp->killMe();
+            sub->append(new types::String(L"cc"));
 
             //create a new operation
             //put previous stage in lhs and
@@ -177,7 +173,7 @@ void TreeVisitor::visit(const MatrixExp &e)
             sub->killMe();
             //add EOL
             //subcolcatOperands->append(getEOL());
-            tmp = getList();
+            types::InternalType* tmp = getList();
             subcolcatOperands->append(tmp);
             tmp->killMe();
 
@@ -195,9 +191,7 @@ void TreeVisitor::visit(const MatrixExp &e)
     }
     sub->append(ope);
     ope->killMe();
-    types::InternalType* tmp = new types::String(L"cc");
-    sub->append(tmp);
-    tmp->killMe();
+    sub->append(new types::String(L"cc"));
     l = sub;
 }
 
@@ -214,7 +208,6 @@ void TreeVisitor::visit(const MatrixLineExp &e)
     types::List* ope = new types::List();
 
     int idx = 0;
-    int last_line = -1;
     for (auto it : columns)
     {
         it->accept(*this);
@@ -223,9 +216,7 @@ void TreeVisitor::visit(const MatrixLineExp &e)
         {
             sub->append(ope);
             ope->killMe();
-            types::InternalType* tmp = new types::String(L"rc");
-            sub->append(tmp);
-            tmp->killMe();
+            sub->append(new types::String(L"rc"));
             //create a new operation
             //put previous stage in lhs and
             //result in rhs
@@ -233,7 +224,7 @@ void TreeVisitor::visit(const MatrixLineExp &e)
             types::List* l2 = new types::List();
             l2->append(sub);
             sub->killMe();
-            tmp = getList();
+            types::InternalType* tmp = getList();
             l2->append(tmp);
             tmp->killMe();
 
@@ -253,9 +244,7 @@ void TreeVisitor::visit(const MatrixLineExp &e)
 
     sub->append(ope);
     ope->killMe();
-    types::InternalType* tmp = new types::String(L"rc");
-    sub->append(tmp);
-    tmp->killMe();
+    sub->append(new types::String(L"rc"));
     l = sub;
 }
 
@@ -358,7 +347,6 @@ void TreeVisitor::visit(const OpExp &e)
     }
 
     ope->append(tmp);
-    tmp->killMe();
     l = ope;
 }
 
@@ -366,15 +354,21 @@ void TreeVisitor::visit(const LogicalOpExp &e)
 {
     types::List* ope = createOperation();
     types::List* sub = new types::List();
+    types::List* tmplst = nullptr;
 
     if (e.getOper() != OpExp::unaryMinus)
     {
         e.getLeft().accept(*this);
-        sub->append(getList());
+        tmplst = getList();
+        sub->append(tmplst);
+        tmplst->killMe();
     }
     e.getRight().accept(*this);
-    sub->append(getList());
+    tmplst = getList();
+    sub->append(tmplst);
+    tmplst->killMe();
     ope->append(sub);
+    sub->killMe();
 
     types::InternalType* tmp = nullptr;
     switch (e.getOper())
@@ -397,7 +391,6 @@ void TreeVisitor::visit(const LogicalOpExp &e)
     }
 
     ope->append(tmp);
-    tmp->killMe();
     l = ope;
 }
 
@@ -485,9 +478,8 @@ void TreeVisitor::visit(const AssignExp &e)
 
     //expression : what to assign
     e.getRightExp().accept(*this);
-    types::InternalType* tmp = getList();
+    types::List* tmp = getList();
     assign->append(tmp);
-    tmp->killMe();
 
     double* dlhs = NULL;
     if (e.getRightExp().isCallExp())
@@ -497,6 +489,8 @@ void TreeVisitor::visit(const AssignExp &e)
         dlhs = lhsnb->get();
     }
 
+    tmp->killMe();
+
     //lhs : who to assign
     Exp& left = e.getLeftExp();
     if (left.isSimpleVar())
@@ -572,7 +566,6 @@ void TreeVisitor::visit(const AssignExp &e)
             dlhs[0] = static_cast<double>(lst->getExps().size());
         }
 
-
         assign->append(lhs);
         lhs->killMe();
     }
@@ -591,7 +584,9 @@ void TreeVisitor::visit(const AssignExp &e)
         if (field->getTail()->isSimpleVar())
         {
             SimpleVar* pVar = field->getTail()->getAs<SimpleVar>();
-            lhs->append(createConst(new types::String(pVar->getSymbol().getName().c_str())));
+            tmp = createConst(new types::String(pVar->getSymbol().getName().c_str()));
+            lhs->append(tmp);
+            tmp->killMe();
         }
         else
         {
@@ -606,9 +601,11 @@ void TreeVisitor::visit(const AssignExp &e)
         lhs->killMe();
         //operator
         ins->append(new types::String(L"ins"));
-        types::List* tmp = new types::List();
+        tmp = new types::List();
         tmp->append(ins);
+        ins->killMe();
         assign->append(tmp);
+        tmp->killMe();
     }
 
     //verbose ?
@@ -634,10 +631,13 @@ void TreeVisitor::visit(const CallExp &e)
     for (auto arg : args)
     {
         arg->accept(*this);
-        rhs->append(getList());
+        types::List* tmp = getList();
+        rhs->append(tmp);
+        tmp->killMe();
     }
 
     call->append(rhs);
+    rhs->killMe();
 
     //name
     call->append(new types::String(e.getName().getAs<SimpleVar>()->getSymbol().getName().c_str()));
@@ -664,18 +664,22 @@ void TreeVisitor::visit(const ForExp &e)
     //expression
     //create a AssignExp to call visitor it
     VarDec* vardec = e.getVardec().getAs<VarDec>();
-    SimpleVar* var = new SimpleVar(*vardec->getLocation().clone(), vardec->getSymbol());
+    SimpleVar* var = new SimpleVar(vardec->getLocation(), vardec->getSymbol());
     Exp* init = vardec->getInit().clone();
-    AssignExp* assign = new AssignExp(*vardec->getLocation().clone(), *var, *init);
+    AssignExp* assign = new AssignExp(vardec->getLocation(), *var, *init);
     assign->setVerbose(true);
 
     assign->accept(*this);
-    f->append(getList());
+    types::List* tmp = getList();
+    f->append(tmp);
+    tmp->killMe();
     delete assign;
 
     //statements
     e.getBody().accept(*this);
-    f->append(getList());
+    tmp = getList();
+    f->append(tmp);
+    tmp->killMe();
     l = f;
 }
 
@@ -686,21 +690,28 @@ void TreeVisitor::visit(const FieldExp &e)
 
     //function or varname
     e.getHead()->accept(*this);
-    ope->append(getList());
+    types::List* tmp = getList();
+    ope->append(tmp);
+    tmp->killMe();
 
     //arguments
     if (e.getTail()->isSimpleVar())
     {
         const SimpleVar* pVar = e.getTail()->getAs<SimpleVar>();
-        ope->append(createConst(new types::String(pVar->getSymbol().getName().c_str())));
+        tmp = createConst(new types::String(pVar->getSymbol().getName().c_str()));
+        ope->append(tmp);
+        tmp->killMe();
     }
     else
     {
-        ope->append(getList());
+        tmp = getList();
+        ope->append(tmp);
+        tmp->killMe();
     }
 
     //operator
     ext->append(ope);
+    ope->killMe();
     ext->append(new types::String(L"ext"));
     l = ext;
 }
@@ -718,11 +729,15 @@ void TreeVisitor::visit(const TryCatchExp &e)
 
     //trystat
     e.getTry().accept(*this);
-    tc->append(getList());
+    types::List* tmp = getList();
+    tc->append(tmp);
+    tmp->killMe();
 
     //catchstat
     e.getCatch().accept(*this);
-    tc->append(getList());
+    tmp = getList();
+    tc->append(tmp);
+    tmp->killMe();
 
     l = tc;
 }
@@ -740,20 +755,24 @@ void TreeVisitor::visit(const WhileExp &e)
 
     //expression
     e.getTest().accept(*this);
-    w->append(getList());
+    types::List* tmp = getList();
+    w->append(tmp);
+    tmp->killMe();
 
     //statements
     e.getBody().accept(*this);
-    w->append(getList());
+    tmp = getList();
+    w->append(tmp);
+    tmp->killMe();
     l = w;
 }
 
-void TreeVisitor::visit(const ContinueExp &e)
+void TreeVisitor::visit(const ContinueExp &/*e*/)
 {
     l = createVar(L"continue");
 }
 
-void TreeVisitor::visit(const BreakExp &e)
+void TreeVisitor::visit(const BreakExp &/*e*/)
 {
     l = createVar(L"break");
 }
@@ -770,19 +789,20 @@ void TreeVisitor::visit(const ReturnExp &e)
         types::List* ope = new types::List();
 
         //function or varname
-        types::InternalType* tmp = new types::String(L"return");
-        ope->append(tmp);
-        tmp->killMe();
+        ope->append(new types::String(L"return"));
 
         //arguments
         for (auto arg : e.getExp().getAs<ArrayListExp>()->getExps())
         {
             arg->accept(*this);
-            ope->append(getList());
+            types::List* tmp = getList();
+            ope->append(tmp);
+            tmp->killMe();
         }
 
         //operator
         ext->append(ope);
+        ope->killMe();
         ext->append(new types::String(L"ext"));
         l = ext;
     }
@@ -803,10 +823,12 @@ void TreeVisitor::visit(const SelectExp &e)
     //expression
     types::List* cond = new types::List();
     e.getSelect()->accept(*this);
-    cond->append(getList());
+    types::List* tmp = getList();
+    cond->append(tmp);
+    tmp->killMe();
     cond->append(getEOL());
     select->append(cond);
-
+    cond->killMe();
 
     //cases
     types::List* lcases = new types::List();
@@ -814,16 +836,21 @@ void TreeVisitor::visit(const SelectExp &e)
     for (auto c : cases)
     {
         c->accept(*this);
-        lcases->append(getList());
+        tmp = getList();
+        lcases->append(tmp);
+        tmp->killMe();
     }
 
     select->append(lcases);
+    lcases->killMe();
 
     //default
     if (e.hasDefault())
     {
         e.getDefaultCase()->accept(*this);
-        select->append(getList());
+        tmp = getList();
+        select->append(tmp);
+        tmp->killMe();
     }
     else
     {
@@ -846,11 +873,15 @@ void TreeVisitor::visit(const CaseExp &e)
 
     //expression
     e.getTest()->accept(*this);
-    c->append(getList());
+    types::List* tmp = getList();
+    c->append(tmp);
+    tmp->killMe();
 
     //then
     e.getBody()->accept(*this);
-    c->append(getList());
+    tmp = getList();
+    c->append(tmp);
+    tmp->killMe();
 
     l = c;
 }
@@ -861,19 +892,20 @@ void TreeVisitor::visit(const ArrayListExp  &e)
     types::List* ope = new types::List();
 
     //function or varname
-    types::InternalType* tmp = new types::String(L"");
-    ope->append(tmp);
-    tmp->killMe();
+    ope->append(new types::String(L""));
 
     //arguments
     for (auto arg : e.getExps())
     {
         arg->accept(*this);
-        ope->append(getList());
+        types::List* tmp = getList();
+        ope->append(tmp);
+        tmp->killMe();
     }
 
     //operator
     ext->append(ope);
+    ope->killMe();
     ext->append(new types::String(L"ext"));
     l = ext;
 }
@@ -885,10 +917,13 @@ void TreeVisitor::visit(const NotExp  &e)
 
     //function or varname
     e.getExp().accept(*this);
-    ope->append(getList());
+    types::List* tmp = getList();
+    ope->append(tmp);
+    tmp->killMe();
 
     //operator
     ext->append(ope);
+    ope->killMe();
     ext->append(new types::String(L"~"));
     l = ext;
 }
@@ -900,10 +935,13 @@ void TreeVisitor::visit(const TransposeExp  &e)
 
     //function or varname
     e.getExp().accept(*this);
-    ope->append(getList());
+    types::List* tmp = getList();
+    ope->append(tmp);
+    tmp->killMe();
 
     //operator
     ext->append(ope);
+    ope->killMe();
     ext->append(new types::String(L"'"));
     l = ext;
 }
@@ -989,9 +1027,7 @@ types::InternalType* TreeVisitor::getEOL()
     }
 
     eol = new types::List();
-    types::InternalType* tmp = new types::String(L"EOL");
-    eol->append(tmp);
-    tmp->killMe();
+    eol->append(new types::String(L"EOL"));
     return eol;
 }
 
@@ -1002,10 +1038,7 @@ types::List* TreeVisitor::createVar(const std::wstring& str)
     varstr->set(0, L"variable");
     varstr->set(1, L"name");
     var->append(varstr);
-    varstr->killMe();
-    types::InternalType* tmp = new types::String(str.c_str());
-    var->append(tmp);
-    tmp->killMe();
+    var->append(new types::String(str.c_str()));
     return var;
 }
 
index c2dd48c..b6a83be 100644 (file)
@@ -68,6 +68,13 @@ void Parser::parseFile(const std::wstring& fileName, const std::wstring& progNam
     {
         this->setErrorMessage(ParserSingleInstance::getErrorMessage());
     }
+
+    if (getExitStatus() != Parser::Succeded)
+    {
+        delete ParserSingleInstance::getTree();
+        ParserSingleInstance::setTree(nullptr);
+    }
+
     // FIXME : UNLOCK
 }
 
index 056aed1..d19ba47 100644 (file)
@@ -83,7 +83,7 @@ types::Function::ReturnValue sci_macr2tree(types::typed_list &in, int _iRetCount
     {
         types::List* var = ast::TreeVisitor::createVar(p->getSymbol().getName());
         o->append(var);
-        delete var;
+        var->killMe();
     }
 
     l->append(o);
@@ -105,6 +105,7 @@ types::Function::ReturnValue sci_macr2tree(types::typed_list &in, int _iRetCount
     ast::TreeVisitor v;
     body->accept(v);
     //add fake return
+    // is deleted with v
     types::List* statement = v.getList();
 
     types::TList* funcall = new types::TList();
@@ -115,29 +116,20 @@ types::Function::ReturnValue sci_macr2tree(types::typed_list &in, int _iRetCount
     sf->set(3, L"lhsnb");
 
     funcall->append(sf);
-    sf->killMe();
-
-    types::InternalType* tmp = types::Double::Empty();
-    funcall->append(tmp);
-    tmp->killMe();
-
-    tmp = new types::String(L"return");
-    funcall->append(tmp);
-    tmp->killMe();
-
-    tmp = new types::Double(0);
-    funcall->append(tmp);
-    tmp->killMe();
+    funcall->append(types::Double::Empty());
+    funcall->append(new types::String(L"return"));
+    funcall->append(new types::Double(0));
 
     statement->append(funcall);
     funcall->killMe();
 
     statement->append(v.getEOL());
 
-    l->append(v.getList());
+    l->append(statement);
+
     //nb lines
     l->append(new types::Double(macro->getLastLine() - macro->getFirstLine() + 1));
     out.push_back(l);
-    statement->killMe();
+
     return types::Function::OK;
 }
index f578330..ac11219 100644 (file)
@@ -161,6 +161,7 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
         /*fake call to mopen to show file within file()*/
         if (mopen(pwstTemp, L"r", 0, &iID) != MOPEN_NO_ERROR)
         {
+            file->close();
             delete file;
             FREE(pwstTemp);
             Scierror(999, _("%s: Cannot open file %s.\n"), "exec", stFile.data());
@@ -172,6 +173,8 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
         FREE(pwstTemp);
         if (parser.getExitStatus() !=  Parser::Succeded)
         {
+            file->close();
+            delete file;
             if (bErrCatch)
             {
                 out.push_back(new Double(999));
@@ -299,13 +302,26 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
         }
         catch (const ast::InternalAbort& ia)
         {
-            delete pExp;
+            if (file)
+            {
+                file->close();
+                delete file;
+                delete pExp;
+            }
+
             throw ia;
         }
         catch (const ast::InternalError& ie)
         {
             if (bErrCatch == false)
             {
+                if (file)
+                {
+                    file->close();
+                    delete file;
+                    delete pExp;
+                }
+
                 ConfigVariable::setPromptMode(oldVal);
                 ConfigVariable::setExecutedFileID(0);
                 throw ie;
@@ -469,6 +485,7 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
         {
             mclose(iID);
         }
+
         file->close();
         delete file;
     }
index f460dee..ca63140 100644 (file)
@@ -14,7 +14,7 @@
 // Unrelated error message when running genlib on a sci file containing a scilab function
 // with a missing parenthesis
 // Error: "mprintf: wrong number of input arguments: data do not fit with format"
-
+// <-- CLI SHELL MODE -->
 my_function = ["function test()";"foo(";"endfunction"];
 my_dir      = pathconvert(TMPDIR+"/bug12593_dir");
 my_file     = my_dir+"test.sci";
index db8ee02..2d2a319 100644 (file)
@@ -12,7 +12,7 @@
 //
 // <-- Short Description -->
 // head_comments did not take into account compiled functions
-
+// <-- CLI SHELL MODE -->
 function test()
     // heading comment L#1
     // heading comment L#2
index f302a01..51f9967 100644 (file)
@@ -12,6 +12,7 @@
 // <-- Short Description -->
 // genlib function had a behavior which was not consistent with the load function.
 // =============================================================================
+// <-- CLI SHELL MODE -->
 f = [
 "function titi()"
 "  disp(''titi'');"
@@ -27,34 +28,34 @@ f = [
 ""
 ];
 cd TMPDIR;
-mkdir('bug_6549');
-cd('bug_6549'); 
-mputl(f,'toto.sci');
-if genlib('bug_6549lib',TMPDIR + '/bug_6549') <> %t then pause,end;
+mkdir("bug_6549");
+cd("bug_6549");
+mputl(f,"toto.sci");
+if genlib("bug_6549lib",TMPDIR + "/bug_6549") <> %t then pause,end;
 // =============================================================================
-ierr = execstr('toto','errcatch');
+ierr = execstr("toto","errcatch");
 if ierr <> 0 then pause,end
-ierr = execstr('titi','errcatch');
+ierr = execstr("titi","errcatch");
 if ierr <> 0 then pause,end
-ierr = execstr('tata','errcatch');
+ierr = execstr("tata","errcatch");
 if ierr <> 0 then pause,end
 clear bug_6549lib titi toto tata ierr;
 // =============================================================================
-load(TMPDIR + '/bug_6549/lib');
-ierr = execstr('toto','errcatch');
+load(TMPDIR + "/bug_6549/lib");
+ierr = execstr("toto","errcatch");
 if ierr <> 0 then pause,end
-ierr = execstr('titi','errcatch');
+ierr = execstr("titi","errcatch");
 if ierr <> 0 then pause,end
-ierr = execstr('tata','errcatch');
+ierr = execstr("tata","errcatch");
 if ierr <> 0 then pause,end
 clear bug_6549lib titi toto tata ierr;
 // =============================================================================
-bug_6549lib = lib(TMPDIR + '/bug_6549');
-ierr = execstr('toto','errcatch');
+bug_6549lib = lib(TMPDIR + "/bug_6549");
+ierr = execstr("toto","errcatch");
 if ierr <> 0 then pause,end
-ierr = execstr('titi','errcatch');
+ierr = execstr("titi","errcatch");
 if ierr <> 0 then pause,end
-ierr = execstr('tata','errcatch');
+ierr = execstr("tata","errcatch");
 if ierr <> 0 then pause,end
 clear bug_6549lib titi toto tata ierr;
 // =============================================================================
index 79d2b61..0653542 100644 (file)
 //
 // <-- Short Description -->
 // lib(".") used relative path in library variable created
+// <-- CLI SHELL MODE -->
 // =============================================================================
 function z = myplus(x, y), z = x + y,endfunction
 function z = yourplus(x, y), x = x - y,endfunction
 // =============================================================================
 cd TMPDIR;
-mkdir('bug_6550');
-libdir = TMPDIR + '/bug_6550';
+mkdir("bug_6550");
+libdir = TMPDIR + "/bug_6550";
 warning("off");
-save(libdir + '/myplus.bin', myplus);
-save(libdir + '/yourplus.bin', yourplus);
+save(libdir + "/myplus.bin", "myplus");
+save(libdir + "/yourplus.bin", "yourplus");
 //create the name file
-mputl(['myplus';'yourplus'], libdir + '/names');
+mputl(["myplus";"yourplus"], libdir + "/names");
 // =============================================================================
 cd(libdir);
-AAlib = lib('.');
-[f, p] = libraryinfo('AAlib');
+AAlib = lib(".");
+[f, p] = libraryinfo("AAlib");
 if pathconvert(p, %f, %f) <> pathconvert(libdir, %f, %f) then pause,end
 // =============================================================================
-BBlib = lib(libdir + '/../bug_6550/../bug_6550');
-[f, p] = libraryinfo('BBlib');
+BBlib = lib(libdir + "/../bug_6550/../bug_6550");
+[f, p] = libraryinfo("BBlib");
 if pathconvert(p, %f, %f) <> pathconvert(libdir, %f, %f) then pause,end
 // =============================================================================
index 059fedb..c176660 100644 (file)
@@ -117,7 +117,9 @@ Function::ReturnValue sci_genlib(typed_list &in, int _iRetCount, typed_list &out
     else
     {
         int ierr = 0;
-        pIT = new String(scigetcwd(&ierr));
+        char* pstr = scigetcwd(&ierr);
+        pIT = new String(pstr);
+        FREE(pstr);
     }
 
     pS = pIT->getAs<String>();
@@ -147,6 +149,11 @@ Function::ReturnValue sci_genlib(typed_list &in, int _iRetCount, typed_list &out
     wchar_t* pstFile = pS->get(0);
     pstParsePath = expandPathVariableW(pstFile);
 
+    if (in.size() == 1)
+    {
+        delete pS;
+    }
+
     os_swprintf(pstParseFile, PATH_MAX + FILENAME_MAX, L"%ls%lslib", pstParsePath, FILE_SEPARATOR);
 
     if (bVerbose)