* Bug #14331 fixed - lsq(A,B,%eps) crashed Scilab. 48/17748/3
Adeline CARNIS [Mon, 1 Feb 2016 10:47:58 +0000 (11:47 +0100)]
Change-Id: I3e0ba72800e325c8f2b629ae8809342c89d99edc

scilab/CHANGES_6.0.X
scilab/modules/linear_algebra/sci_gateway/cpp/sci_lsq.cpp
scilab/modules/linear_algebra/tests/nonreg_tests/bug_14331.dia.ref [new file with mode: 0644]
scilab/modules/linear_algebra/tests/nonreg_tests/bug_14331.tst [new file with mode: 0644]

index 87baa24..4f05623 100644 (file)
@@ -75,6 +75,8 @@ Bug Fixes
 
 * Bug #14316 fixed - Operation scalar^matrix was identical to scalar.^matrix instead of being expm( log(scalar) * matrix )
 
+* Bug #14331 fixed - The third argument of lsq crashed Scilab.
+
 Dependencies
 =============
 
index 861720a..1542ff4 100644 (file)
@@ -57,7 +57,9 @@ types::Function::ReturnValue sci_lsq(types::typed_list &in, int _iRetCount, type
         return Overload::call(wstFuncName, in, _iRetCount, out);
     }
 
-    if (in.size() == 2)
+    pDbl[0] = in[0]->getAs<types::Double>()->clone()->getAs<types::Double>();
+
+    if (in.size() <=  3)
     {
         if ((in[1]->isDouble() == false))
         {
@@ -74,10 +76,10 @@ types::Function::ReturnValue sci_lsq(types::typed_list &in, int _iRetCount, type
             Scierror(256, _("%s: Wrong type for input argument #%d: A Real expected.\n"), "lsq", 3);
             return types::Function::Error;
         }
-        *pdTol = in[2]->getAs<types::Double>()->get(0);
-    }
 
-    pDbl[0] = in[0]->getAs<types::Double>()->clone()->getAs<types::Double>();
+        double dblTol = in[2]->getAs<types::Double>()->get(0);
+        pdTol = &dblTol;
+    }
 
     if (pDbl[0]->getRows() != pDbl[1]->getRows())
     {
diff --git a/scilab/modules/linear_algebra/tests/nonreg_tests/bug_14331.dia.ref b/scilab/modules/linear_algebra/tests/nonreg_tests/bug_14331.dia.ref
new file mode 100644 (file)
index 0000000..b4cacd0
--- /dev/null
@@ -0,0 +1,49 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 14331 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14331
+//
+// <-- Short Description -->
+// The third argument of lsq crashed Scilab.
+A = [1. 83.0 234289 2356 1590 107608 1947
+1. 88.5 259426 2325 1456 108632 1948
+1. 88.2 258054 3682 1616 109773 1949
+1. 89.5 284599 3351 1650 110929 1950
+1. 96.2 328975 2099 3099 112075 1951
+1. 98.1 346999 1932 3594 113270 1952
+1. 99.0 365385 1870 3547 115094 1953
+1. 100.0 363112 3578 3350 116219 1954
+1. 101.2 397469 2904 3048 117388 1955
+1. 104.6 419180 2822 2857 118734 1956
+1. 108.4 442769 2936 2798 120445 1957
+1. 110.8 444546 4681 2637 121950 1958
+1. 112.6 482704 3813 2552 123366 1959
+1. 114.2 502601 3931 2514 125368 1960
+1. 115.7 518173 4806 2572 127852 1961
+1. 116.9 554894 4007 2827 130081 1962];
+B = [60323
+61122
+60171
+61187
+63221
+63639
+64989
+63761
+66019
+67857
+68169
+66513
+68655
+69564
+69331
+70551];
+X = lsq(A, B, %eps);
+X1 = A\B;
+assert_checkalmostequal(X, X1, %eps);
diff --git a/scilab/modules/linear_algebra/tests/nonreg_tests/bug_14331.tst b/scilab/modules/linear_algebra/tests/nonreg_tests/bug_14331.tst
new file mode 100644 (file)
index 0000000..9e0ddcc
--- /dev/null
@@ -0,0 +1,54 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 14331 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14331
+//
+// <-- Short Description -->
+// The third argument of lsq crashed Scilab.
+
+A = [1. 83.0 234289 2356 1590 107608 1947
+1. 88.5 259426 2325 1456 108632 1948
+1. 88.2 258054 3682 1616 109773 1949
+1. 89.5 284599 3351 1650 110929 1950
+1. 96.2 328975 2099 3099 112075 1951
+1. 98.1 346999 1932 3594 113270 1952
+1. 99.0 365385 1870 3547 115094 1953
+1. 100.0 363112 3578 3350 116219 1954
+1. 101.2 397469 2904 3048 117388 1955
+1. 104.6 419180 2822 2857 118734 1956
+1. 108.4 442769 2936 2798 120445 1957
+1. 110.8 444546 4681 2637 121950 1958
+1. 112.6 482704 3813 2552 123366 1959
+1. 114.2 502601 3931 2514 125368 1960
+1. 115.7 518173 4806 2572 127852 1961
+1. 116.9 554894 4007 2827 130081 1962];
+
+B = [60323
+61122
+60171
+61187
+63221
+63639
+64989
+63761
+66019
+67857
+68169
+66513
+68655
+69564
+69331
+70551];
+
+X = lsq(A, B, %eps);
+X1 = A\B;
+assert_checkalmostequal(X, X1, %eps);