]> granicus.if.org Git - python/commitdiff
PyLong_FromString(): fix Coverity CID 1424951 (#4738)
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 7 Dec 2017 23:06:55 +0000 (00:06 +0100)
committerGitHub <noreply@github.com>
Thu, 7 Dec 2017 23:06:55 +0000 (00:06 +0100)
Explicitly cast digits (Py_ssize_t) to double to fix the following
false-alarm warning from Coverity:

"fsize_z = digits * log_base_BASE[base] + 1;"

CID 1424951: Incorrect expression (UNINTENDED_INTEGER_DIVISION)
Dividing integer expressions "9223372036854775783UL" and "4UL", and
then converting the integer quotient to type "double". Any remainder,
or fractional part of the quotient, is ignored.

Objects/longobject.c

index a7f496825ebd1fd83a4d7d63d1d2c54f3e694a8f..269d6cdea590ff1679f579aaac910d2c54e479a3 100644 (file)
@@ -2267,7 +2267,6 @@ just 1 digit at the start, so that the copying code was exercised for every
 digit beyond the first.
 ***/
         twodigits c;           /* current input character */
-        double fsize_z;
         Py_ssize_t size_z;
         Py_ssize_t digits = 0;
         int i;
@@ -2331,8 +2330,8 @@ digit beyond the first.
          * need to initialize z->ob_digit -- no slot is read up before
          * being stored into.
          */
-        fsize_z = digits * log_base_BASE[base] + 1;
-        if (fsize_z > MAX_LONG_DIGITS) {
+        double fsize_z = (double)digits * log_base_BASE[base] + 1.0;
+        if (fsize_z > (double)MAX_LONG_DIGITS) {
             /* The same exception as in _PyLong_New(). */
             PyErr_SetString(PyExc_OverflowError,
                             "too many digits in integer");