* Bug 15645 fixed: now deff('y=f(x)','z=x^2'),fsolve(1,f) raises an error 13/20213/2
St├ęphane Mottelet [Wed, 4 Jul 2018 12:48:46 +0000 (14:48 +0200)]
http://bugzilla.scilab.org/show_bug.cgi?id=15645

Change-Id: Ia1a3a335c970f9ecc265e89138efccd4a082fa68

scilab/CHANGES.md
scilab/modules/optimization/sci_gateway/cpp/sci_fsolve.cpp
scilab/modules/optimization/src/cpp/scioptimfunctions.cpp
scilab/modules/optimization/tests/nonreg_tests/bug_15645.tst [new file with mode: 0644]

index 16a546b..ec6909e 100644 (file)
@@ -564,8 +564,9 @@ Known issues
 * [#15632](http://bugzilla.scilab.org/show_bug.cgi?id=15632): `x=[];x()=1` crashed Scilab.
 * [#15635](http://bugzilla.scilab.org/show_bug.cgi?id=15635): `dellip(1,4)` terminated with neither output nor error (regression)
 * [#15636](http://bugzilla.scilab.org/show_bug.cgi?id=15636): Clicking on its icon did not always give focus to Help browser
-* [#15648](http://bugzilla.scilab.org/show_bug.cgi?id=15648): `sparse([1 1],1,[-1 -1])` crashed scilab
+* [#15645](http://bugzilla.scilab.org/show_bug.cgi?id=15645): `deff('y=f(x)','z=x^2'),fsolve(1,f)` crashed scilab
 * [#15647](http://bugzilla.scilab.org/show_bug.cgi?id=15647): `spzeros(-1,-1)` yielded a corrupted result
+* [#15648](http://bugzilla.scilab.org/show_bug.cgi?id=15648): `sparse([1 1],1,[-1 -1])` crashed scilab
 * [#15652](http://bugzilla.scilab.org/show_bug.cgi?id=15652): An appended comment // after a comma in an multiline literal array now generates an error (regression).
 * [#15653](http://bugzilla.scilab.org/show_bug.cgi?id=15653): sparse - complex substraction was corrupted
 * [#15655](http://bugzilla.scilab.org/show_bug.cgi?id=15655): `clear a; a(1:4,:,1) = (1:4)` raised an error  (regression).
index dd9555c..2c0c3a2 100644 (file)
 #include "string.hxx"
 #include "list.hxx"
 #include "optimizationfunctions.hxx"
+#include "configvariable.hxx"
 
 extern "C"
 {
 #include "localization.h"
 #include "Scierror.h"
-#include "sciprint.h"
 #include "scioptimfunctions.h"
 #include "sci_malloc.h"
 }
@@ -264,35 +264,14 @@ types::Function::ReturnValue sci_fsolve(types::typed_list &in, int _iRetCount, t
     // alloc output data
     pDblV = new types::Double(pDblX->getDims(), pDblX->getDimsArray());
 
-    char const * pstrFunc = "fct";
-    try
+    if (bJac)
     {
-        if (bJac)
-        {
-            pstrFunc = "jac";
-            pdblJac = new double[iSizeX * iSizeX];
-            C2F(hybrj1)(jac, &iSizeX, pDblX->get(), pDblV->get(), pdblJac, &iSizeX, &dTol, &iInfo, pdblWork, &iWorkSize);
-        }
-        else
-        {
-            C2F(hybrd1)(fct, &iSizeX, pDblX->get(), pDblV->get(), &dTol, &iInfo, pdblWork, &iWorkSize);
-        }
+        pdblJac = new double[iSizeX * iSizeX];
+        C2F(hybrj1)(jac, &iSizeX, pDblX->get(), pDblV->get(), pdblJac, &iSizeX, &dTol, &iInfo, pdblWork, &iWorkSize);
     }
-    catch (const ast::InternalError &e)
+    else
     {
-        char* pstrMsg = wide_string_to_UTF8(e.GetErrorMessage().c_str());
-        sciprint(_("%s: exception caught in '%s' subroutine.\n"), "fsolve", pstrFunc);
-        Scierror(999, pstrMsg);
-        FREE(pstrMsg);
-        delete[] pdblWork;
-        delete pDblX;
-        if (pdblJac)
-        {
-            delete[] pdblJac;
-        }
-
-        Optimization::removeOptimizationFunctions();
-        return types::Function::Error;
+        C2F(hybrd1)(fct, &iSizeX, pDblX->get(), pDblV->get(), &dTol, &iInfo, pdblWork, &iWorkSize);
     }
 
     Optimization::removeOptimizationFunctions();
@@ -303,6 +282,14 @@ types::Function::ReturnValue sci_fsolve(types::typed_list &in, int _iRetCount, t
         delete[] pdblJac;
     }
 
+    /* If error has been catched in fct or jac */
+    if (iInfo == -1)
+    {
+        char* pstrMsg = wide_string_to_UTF8(ConfigVariable::getLastErrorMessage().c_str());
+        Scierror(999, "fsolve: %s\n",pstrMsg);
+        return types::Function::Error;
+    }
+
     /*** return output arguments ***/
     out.push_back(pDblX);
 
@@ -323,6 +310,7 @@ types::Function::ReturnValue sci_fsolve(types::typed_list &in, int _iRetCount, t
     // info = 3   tol is too small. no further improvement in
     // the approximate solution x is possible.
     // info = 4   iteration is not making good progress.
+
     if (_iRetCount == 3)
     {
         out.push_back(new types::Double((double)iInfo));
index 9cbcb51..aa052ff 100644 (file)
@@ -45,7 +45,14 @@ void fct(int *n, double *x, double *v, int *iflag)
         throw ast::InternalError(_("An error occurred while getting OptimizationFunctions object.\n"));
     }
 
-    opFunction->execFsolveFct(n, x, v, iflag);
+    try
+    {
+        opFunction->execFsolveFct(n, x, v, iflag);
+    }
+    catch (const ast::InternalError)
+    {
+        *iflag=-1;
+    }
 }
 
 void jac(int *n, double *x, double *v, double *jac, int *ldjac, int *iflag)
@@ -58,14 +65,21 @@ void jac(int *n, double *x, double *v, double *jac, int *ldjac, int *iflag)
         throw ast::InternalError(_("An error occurred while getting OptimizationFunctions object.\n"));
     }
 
-    if (*iflag == 1)
+    try
     {
-        opFunction->execFsolveFct(n, x, v, iflag);
+        if (*iflag == 1)
+        {
+            opFunction->execFsolveFct(n, x, v, iflag);
+        }
+        else
+        {
+            opFunction->execFsolveJac(n, x, v, jac, ldjac, iflag);
+        }        
     }
-    else
+    catch (const ast::InternalError)
     {
-        opFunction->execFsolveJac(n, x, v, jac, ldjac, iflag);
-    }
+        *iflag=-1;
+    }        
 }
 
 // lsqrsolve
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_15645.tst b/scilab/modules/optimization/tests/nonreg_tests/bug_15645.tst
new file mode 100644 (file)
index 0000000..baecd56
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - St├ęphane Mottelet
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 15645 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=15645
+//
+// <-- Short Description -->
+// deff('y=f(x)','z=x^2'),fsolve(1,f) crashes scilab
+
+deff('y=f1(x)','z=x^2'); 
+deff('y=f2(x)','y=x^2'); 
+deff('dy=df(x)','dz=2*x');
+assert_checkerror("fsolve(1,f1)","fsolve: Undefined variable ''y'' in function ''f1''.");
+assert_checkerror("fsolve(1,f2,df)","fsolve: Undefined variable ''dy'' in function ''df''.");