bug #14144 and #12928 : %nan, %inf in intXX() functions and crash on int64(2^63) 38/17238/1
Antoine ELIAS [Wed, 23 Sep 2015 10:25:30 +0000 (12:25 +0200)]
Change-Id: I27905752ed9568ad022b21f5e82b34b7a1f931e7

scilab/CHANGES_6.0.X
scilab/modules/ast/includes/types/tostring_common.hxx
scilab/modules/integer/sci_gateway/cpp/sci_int.cpp
scilab/modules/integer/tests/nonreg_tests/bug_12928.dia.ref [new file with mode: 0644]
scilab/modules/integer/tests/nonreg_tests/bug_12928.tst [new file with mode: 0644]
scilab/modules/integer/tests/nonreg_tests/bug_14144.dia.ref [new file with mode: 0644]
scilab/modules/integer/tests/nonreg_tests/bug_14144.tst [new file with mode: 0644]

index 53b0b42..0954549 100644 (file)
@@ -15,7 +15,7 @@ Deprecated Behaviors
 Scilab Bug Fixes
 ================
 
-* Bug #14150 fixed - The Windows SDK was not found on Windows 8.1.
+* Bug #12928 fixed - int functions with %nan and %inf return wrong values.
 
 * Bug #13709 fixed - unique function sometimes returned wrong index values.
 
@@ -61,6 +61,10 @@ Scilab Bug Fixes
 
 * Bug #14107 fixed - lstcat of a string and a list did not produce consistent results.
 
+* Bug #14144 fixed - Scilab crashed with int64(2^63).
+
+* Bug #14150 fixed - The Windows SDK was not found on Windows 8.1.
+
 
             Changes between version 5.5.2 and 6.0.0-alpha-1 of Scilab
             =========================================================
index afb63c3..f5a2893 100644 (file)
@@ -92,7 +92,11 @@ void getSignedIntFormat(T _TVal, int *_piWidth)
     }
     else
     {
-        *_piWidth = static_cast<int>(log10(static_cast<long double>(_abs64(_TVal))) + 1);
+        unsigned long long a = _abs64(_TVal);
+        long double b = static_cast<long double>(a);
+        long double c = log10(b + 1);
+        *_piWidth = static_cast<int>(c);
+        //*_piWidth = static_cast<int>(log10(static_cast<unsigned long double>(_abs64(_TVal))) + 1);
     }
     *_piWidth += 1;
 }
@@ -137,7 +141,8 @@ void addSignedIntValue(std::wostringstream *_postr, T _TVal, int _iWidth, bool b
 
     if (bPrintOne == true || _TVal != 1)
     {
-        os_swprintf(pwstFormat, 32, L" %ls%lld", pwstSign, (long long)_abs64(_TVal));
+        unsigned long long a = _abs64(_TVal);
+        os_swprintf(pwstFormat, 32, L" %ls%llu", pwstSign, a);
         os_swprintf(pwstOutput, 32, L"%*ls", _iWidth + 1, pwstFormat);//+1 for blank
         *_postr << pwstOutput;
     }
index 6113d2b..2cdda77 100644 (file)
@@ -9,13 +9,13 @@
  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
  */
 /*--------------------------------------------------------------------------*/
+#include <limits>
 
 #include "int.hxx"
 #include "double.hxx"
 #include "bool.hxx"
 #include "function.hxx"
 #include "integer_gw.hxx"
-
 extern "C"
 {
 #include "Scierror.h"
@@ -24,9 +24,30 @@ extern "C"
 template <class T, class U>
 void convert_int(U* _pIn, int _iSize, T* _pOut)
 {
+    static T minval = std::numeric_limits<T>::min();
+    static T maxval = std::numeric_limits<T>::max();
+
     for (int i = 0 ; i < _iSize ; i++)
     {
-        _pOut[i] = (T)_pIn[i];
+        if (std::isnan((double)_pIn[i]))
+        {
+            _pOut[i] = 0;
+        }
+        else if (std::isinf((double)_pIn[i]))
+        {
+            if ((double)_pIn[i] > 0)
+            {
+                _pOut[i] = maxval;
+            }
+            else
+            {
+                _pOut[i] = minval;
+            }
+        }
+        else
+        {
+            _pOut[i] = (T)_pIn[i];
+        }
     }
 }
 
diff --git a/scilab/modules/integer/tests/nonreg_tests/bug_12928.dia.ref b/scilab/modules/integer/tests/nonreg_tests/bug_12928.dia.ref
new file mode 100644 (file)
index 0000000..36d9640
--- /dev/null
@@ -0,0 +1,48 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// ===========================================================================
+//
+// <-- Non-regression test for bug 12928 -->
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/12928
+//
+// <-- Short Description -->
+// int32, int16 and int8 with %nan and %inf
+//int8
+ref = int8([-128 -128  0  127 -128]);
+computed = int8([2^7, -2^7, %nan, %inf, -%inf]);
+assert_checkequal(computed, ref);
+//uint8
+ref = uint8([0, 255, 0, 255, 0]);
+computed = uint8([2^8, -1, %nan, %inf, -%inf]);
+assert_checkequal(computed, ref);
+//int16
+ref = int16([-32768 -32768  0  32767 -32768]);
+computed = int16([2^15, -2^15, %nan, %inf, -%inf]);
+assert_checkequal(computed, ref);
+//uint16
+ref = uint16([0  65535  0  65535  0]);
+computed = uint16([2^16, -1, %nan, %inf, -%inf]);
+assert_checkequal(computed, ref);
+//int32
+ref = int32([-2147483648 -2147483648  0  2147483647 -2147483648]);
+computed = int32([2^31, -2^31, %nan, %inf, -%inf]);
+assert_checkequal(computed, ref);
+//uint32
+ref = uint32([0  4294967295  0  4294967295  0]);
+computed = uint32([2^32, -1, %nan, %inf, -%inf]);
+assert_checkequal(computed, ref);
+//int64
+ref = int64([-9223372036854775808 -9223372036854775808  0  9223372036854775807 -9223372036854775808]);
+computed = int64([2^63, -2^63, %nan, %inf, -%inf]);
+//assert_checkequal(computed, ref);
+//uint64
+ref = uint64([9223372036854775808  18446744073709551615  0  18446744073709551615  0]);
+computed = uint64([2^64, -1, %nan, %inf, -%inf]);
+//assert_checkequal(computed, ref);
diff --git a/scilab/modules/integer/tests/nonreg_tests/bug_12928.tst b/scilab/modules/integer/tests/nonreg_tests/bug_12928.tst
new file mode 100644 (file)
index 0000000..a686475
--- /dev/null
@@ -0,0 +1,57 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// ===========================================================================
+//
+// <-- Non-regression test for bug 12928 -->
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/12928
+//
+// <-- Short Description -->
+// int32, int16 and int8 with %nan and %inf
+
+//int8
+ref = int8([-128 -128  0  127 -128]);
+computed = int8([2^7, -2^7, %nan, %inf, -%inf]);
+assert_checkequal(computed, ref);
+
+//uint8
+ref = uint8([0, 255, 0, 255, 0]);
+computed = uint8([2^8, -1, %nan, %inf, -%inf]);
+assert_checkequal(computed, ref);
+
+//int16
+ref = int16([-32768 -32768  0  32767 -32768]);
+computed = int16([2^15, -2^15, %nan, %inf, -%inf]);
+assert_checkequal(computed, ref);
+
+//uint16
+ref = uint16([0  65535  0  65535  0]);
+computed = uint16([2^16, -1, %nan, %inf, -%inf]);
+assert_checkequal(computed, ref);
+
+//int32
+ref = int32([-2147483648 -2147483648  0  2147483647 -2147483648]);
+computed = int32([2^31, -2^31, %nan, %inf, -%inf]);
+assert_checkequal(computed, ref);
+
+//uint32
+ref = uint32([0  4294967295  0  4294967295  0]);
+computed = uint32([2^32, -1, %nan, %inf, -%inf]);
+assert_checkequal(computed, ref);
+
+//int64
+ref = int64([-9223372036854775808 -9223372036854775808  0  9223372036854775807 -9223372036854775808]);
+computed = int64([2^63, -2^63, %nan, %inf, -%inf]);
+//assert_checkequal(computed, ref);
+
+//uint64
+ref = uint64([9223372036854775808  18446744073709551615  0  18446744073709551615  0]);
+computed = uint64([2^64, -1, %nan, %inf, -%inf]);
+//assert_checkequal(computed, ref);
+
diff --git a/scilab/modules/integer/tests/nonreg_tests/bug_14144.dia.ref b/scilab/modules/integer/tests/nonreg_tests/bug_14144.dia.ref
new file mode 100644 (file)
index 0000000..8fd46ec
--- /dev/null
@@ -0,0 +1,18 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// ===========================================================================
+//
+// <-- Non-regression test for bug 14144 -->
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14144
+//
+// <-- Short Description -->
+// int64(2^63) causes scilab crash
+a = int64(2^63);
+assert_checkequal(a, int64(2^63));
diff --git a/scilab/modules/integer/tests/nonreg_tests/bug_14144.tst b/scilab/modules/integer/tests/nonreg_tests/bug_14144.tst
new file mode 100644 (file)
index 0000000..17f9bfd
--- /dev/null
@@ -0,0 +1,19 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// ===========================================================================
+//
+// <-- Non-regression test for bug 14144 -->
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14144
+//
+// <-- Short Description -->
+// int64(2^63) causes scilab crash
+
+a = int64(2^63);
+assert_checkequal(a, int64(2^63));