* Bug 16661 fixed: now spzeros and sparse yield correct error messages 17/21717/5
Cedric Delamarre [Thu, 8 Apr 2021 11:42:43 +0000 (13:42 +0200)]
Messages about dimensions limitations are not explicit, see
https://bugzilla.scilab.org/show_bug.cgi?id=16661 . It also:

 * restores big sparse features after 5b1796f8
 * change error to warning when creating a sparse of size > INT_MAX

Change-Id: I750ba1a5b2ba4e2d36876df75fb81fa80e63cfa3

scilab/CHANGES.md
scilab/modules/sparse/sci_gateway/cpp/sci_sparse.cpp
scilab/modules/sparse/sci_gateway/cpp/sci_spzeros.cpp
scilab/modules/sparse/tests/nonreg_tests/bug_16661.tst [new file with mode: 0644]

index 487455f..d4fd155 100644 (file)
@@ -459,6 +459,7 @@ Bug Fixes
 * [#16639](https://bugzilla.scilab.org/16639): `atomsInstall` and `atomsRemove` did not update the Toolboxes menu.
 * [#16644](https://bugzilla.scilab.org/16644): `input("message:")` yielded a wrong error message about `mprintf` in case of non-interpretable input.
 * [#16654](https://bugzilla.scilab.org/16654): `interp` was leaking memory.
+* [#16661](https://bugzilla.scilab.org/16661): `x=spzeros(1e10,1e10)` yielded an incorrect error message.
 * [#16665](https://bugzilla.scilab.org/16665): `help echo` could not redirect to `help mode` when preferred, for new users coming from Octave.
 
 
index 69e1028..6cf887a 100644 (file)
@@ -24,6 +24,7 @@ extern "C"
 {
 #include "charEncoding.h"
 #include "Scierror.h"
+#include "sciprint.h"
 #include "localization.h"
 }
 
@@ -147,17 +148,27 @@ types::Function::ReturnValue sci_sparse(types::typed_list &in, int _piRetCount,
                 return types::Function::Error;
             }
 
+            if ( pDdims->get(0) > (double) INT_MAX || pDdims->get(1) > (double) INT_MAX)
+            {
+                Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be less than %d.\n"), "sparse", 3,INT_MAX);
+                return types::Function::Error;
+            }
+
             if (pDdims->get(0) != (double) ( (unsigned int) pDdims->get(0) ) || pDdims->get(1) != (double) ( (unsigned int) pDdims->get(1) ))
             {
                 Scierror(999, _("%s: Wrong values for input argument #%d: Positive integers expected.\n"), "sparse", 3);
                 return types::Function::Error;
             }
 
-            if (pDdims->get(0) * pDdims->get(1) > INT_MAX)
+            if (pDdims->get(0) * pDdims->get(1) > (double) INT_MAX)
             {
-                Scierror(999, _("%s: Wrong value for input argument #%d: The maximum total size expected is %d.\n"), "sparse", 3, INT_MAX);
-                return types::Function::Error;
+                // FIXME: should be an error. To fix we need GenericType::m_iSize huger than int
+                if (getWarningMode())
+                {
+                    sciprint(_("%s: Warning: You have created a Sparse of size > %d.\nDue to a Scilab limitation, reading or writing values from/to \nthis sparse using a unique index could lead to unexpected behavior."), "sparse", INT_MAX);
+                }
             }
+
         }
 
         bool alloc = false;
index 606347e..3b914c4 100644 (file)
@@ -21,6 +21,7 @@ extern "C"
 {
 #include "charEncoding.h"
 #include "Scierror.h"
+#include "sciprint.h"
 #include "localization.h"
 }
 
@@ -73,22 +74,35 @@ types::Function::ReturnValue sci_spzeros(types::typed_list &in, int _iRetCount,
 
         double dblRows = pDblRows->get(0);
         double dblCols = pDblCols->get(0);
+        if (dblRows > (double) INT_MAX)
+        {
+            Scierror(999, _("%s: Wrong value for input argument #%d: Must be less than %d.\n"), "spzeros", 1,INT_MAX);
+            return types::Function::Error;
+        }
         if (dblRows != (double) ((unsigned int) dblRows))
         {
             Scierror(999, _("%s: Wrong value for input argument #%d: Scalar positive integer expected.\n"), "spzeros", 1);
             return types::Function::Error;
         }
 
+        if (dblCols > (double) INT_MAX)
+        {
+            Scierror(999, _("%s: Wrong value for input argument #%d: Must be less than %d.\n"), "spzeros", 2,INT_MAX);
+            return types::Function::Error;
+        }
         if (dblCols != (double) ((unsigned int) dblCols))
         {
-            Scierror(999, _("%s: Wrong value for input argument #%d: Scalar positive integer expected.\n"), "spzeros", 2);
+            Scierror(999, _("%s: Wrong value for input argument #%d: Scalar positive integer expected.\n"), "spzeros", 1);
             return types::Function::Error;
         }
 
-        if (dblRows * dblCols > INT_MAX)
+        if (dblRows * dblCols > (double) INT_MAX)
         {
-            Scierror(999, _("%s: Wrong value for input arguments: The maximum total size expected is %d.\n"), "spzeros", INT_MAX);
-            return types::Function::Error;
+            // FIXME: should be an error. To fix we need GenericType::m_iSize huger than int
+            if (getWarningMode())
+            {
+                sciprint(_("%s: Warning: You have created a Sparse of size > %d.\nDue to a Scilab limitation, reading or writing values from/to \nthis sparse using a unique index could lead to unexpected behavior."), "sparse", INT_MAX);
+            }
         }
 
         if (pDblRows->get(0) == 0. || pDblCols->get(0) == 0.)
diff --git a/scilab/modules/sparse/tests/nonreg_tests/bug_16661.tst b/scilab/modules/sparse/tests/nonreg_tests/bug_16661.tst
new file mode 100644 (file)
index 0000000..8bb3e0e
--- /dev/null
@@ -0,0 +1,30 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2021 - St├ęphane MOTTELET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 16661 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16661
+//
+// <-- Short Description -->
+// x=spzeros(1e10,1e10) yields an incorrect error message
+
+INT_MAX = int32(%inf);
+
+cmd = "spzeros(1e10,1)";
+msg = msprintf(_("%s: Wrong value for input argument #%d: Must be less than %d.\n"),"spzeros",1, INT_MAX)
+assert_checkerror(cmd,msg);
+
+cmd = "spzeros(1,1e10)";
+msg = msprintf(_("%s: Wrong value for input argument #%d: Must be less than %d.\n"),"spzeros",2, INT_MAX)
+assert_checkerror(cmd,msg);
+
+cmd = "sparse([1 1],1,[1e10,1e10])";
+msg = msprintf(_("%s: Wrong values for input argument #%d: Elements must be less than %d.\n"),"sparse",3,INT_MAX)
+assert_checkerror(cmd,msg);