[bug_15624] GenericType check missing before cast 62/20462/4
Cedric Delamarre [Fri, 17 Aug 2018 14:38:39 +0000 (16:38 +0200)]
  https://bugzilla.scilab.org/show_bug.cgi?id=15624

  test_run ast bug_15624
  test_run ast bug_15624 mode_nwni_profiling

Change-Id: I4cfae6c034bd61c117dc4c112be119f4295303a7

scilab/CHANGES.md
scilab/modules/ast/includes/types/void.hxx
scilab/modules/ast/tests/nonreg_tests/bug_15624.tst [new file with mode: 0644]
scilab/modules/elementary_functions/sci_gateway/cpp/sci_max.cpp
scilab/modules/fileio/sci_gateway/cpp/sci_newest.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_hdf5_load_v1.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_hdf5_load_v2.cpp
scilab/modules/io/sci_gateway/cpp/sci_write.cpp

index 7a90852..768a831 100644 (file)
@@ -556,6 +556,7 @@ Known issues
 * [#15615](http://bugzilla.scilab.org/show_bug.cgi?id=15615): `datatipToggle()` was a duplicate of `datatipManagerMode()`.
 * [#15617](http://bugzilla.scilab.org/show_bug.cgi?id=15617): `evstr(list(..))` did not check the number and types of list components. When an input component can't be evaluated, the error messages were not clear enough.
 * [#15621](http://bugzilla.scilab.org/show_bug.cgi?id=15621): polynomial exponentiation silently truncated exponent (regression).
+* [#15624](http://bugzilla.scilab.org/show_bug.cgi?id=15624): parser allowed `fun(,)` or `fun(x,)` for built-in functions.
 * [#15625](http://bugzilla.scilab.org/show_bug.cgi?id=15625): `delip(1,1)=0` instead of `Inf`
 * [#15626](http://bugzilla.scilab.org/show_bug.cgi?id=15626): clicking on its icon did not give focus to a docked Scinotes.
 * [#15627](http://bugzilla.scilab.org/show_bug.cgi?id=15627): changing font in SciNotes window with ctrl-mouse wheel in splitted view messed other view.
index 23339a0..a7b616d 100644 (file)
@@ -54,7 +54,7 @@ public :
     /* return type as short string ( s, i, ce, l, ... )*/
     virtual std::wstring    getShortTypeStr() const
     {
-        return L"";
+        return L"0";
     }
 };
 }
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_15624.tst b/scilab/modules/ast/tests/nonreg_tests/bug_15624.tst
new file mode 100644 (file)
index 0000000..f785efb
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - ESI-Group - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 15624 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15624
+//
+// <-- Short Description -->
+// parser shoud not allow fun(,) or fun(x,) for internals
+
+msgerr = [msprintf(gettext("Function not defined for given argument type(s),\n"));
+          msprintf(gettext("  check arguments or define function %s for overloading.\n"), "%0_max")];
+assert_checkerror ("max(,)", msgerr);
+assert_checkerror ("max(1,)", msgerr);
+assert_checkerror ("max(,1)", msgerr);
index 5af0908..de12f10 100644 (file)
@@ -114,6 +114,14 @@ types::Function::ReturnValue sci_MinMax(types::typed_list &in, int _iRetCount, t
     // get the size of the first input non scalar
     for (int i = 0; i < inputs.size(); i++)
     {
+        if(inputs[i]->isGenericType() == false)
+        {
+            wchar_t* wcsMinMax = to_wide_string(fname);
+            std::wstring wstFuncName = L"%" + inputs[i]->getShortTypeStr() + L"_" + wcsMinMax;
+            FREE(wcsMinMax);
+            return Overload::call(wstFuncName, in, _iRetCount, out);
+        }
+
         pGT = inputs[i]->getAs<types::GenericType>();
         if (pGT->getSize() == 0)
         {
index c2dea48..7fde792 100644 (file)
@@ -49,7 +49,7 @@ types::Function::ReturnValue sci_newest(types::typed_list &in, int _iRetCount, t
     {
         if (in[0]->isString() == FALSE)
         {
-            if (in[0]->getAs<types::GenericType>()->getSize() == 0)
+            if (in[0]->isGenericType() && in[0]->getAs<types::GenericType>()->getSize() == 0)
             {
                 out.push_back(types::Double::Empty());
                 return types::Function::OK;
index 6259961..3f021f8 100644 (file)
@@ -1339,6 +1339,12 @@ static bool import_hypermat_v1(int* pvCtx, int _iDatasetId, int _iVarType, int _
     }
 
     // reshape data with size of hypermatrix
+    if(pIT->isGenericType() == false)
+    {
+        delete[] piDimsArray;
+        return false;
+    }
+
     pGT = pIT->getAs<types::GenericType>();
     pGT->reshape(piDimsArray, iCols);
 
index 4cecf2c..d91c553 100644 (file)
@@ -1349,6 +1349,12 @@ static bool import_hypermat(int* pvCtx, int _iDatasetId, int _iVarType, int _iIt
     }
 
     // reshape data with size of hypermatrix
+    if(pIT->isGenericType() == false)
+    {
+        delete[] piDimsArray;
+        return false;
+    }
+
     pGT = pIT->getAs<types::GenericType>();
     pGT->reshape(piDimsArray, piDims[1]);
 
index 1eb76d6..467d438 100644 (file)
@@ -112,6 +112,12 @@ types::Function::ReturnValue sci_write(types::typed_list &in, int _iRetCount, ty
         //iAccess is thrid parameter
     }
 
+    if(in[1]->isGenericType() == false)
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix or column vector expected.\n"), "write", 2);
+        return types::Function::Error;
+    }
+
     int iRows = in[1]->getAs<types::GenericType>()->getRows();
     int iCols;
     if (in[1]->isString())