]> granicus.if.org Git - python/commitdiff
Issue #22156: Fix "comparison between signed and unsigned integers" compiler
authorVictor Stinner <victor.stinner@gmail.com>
Fri, 15 Aug 2014 21:17:38 +0000 (23:17 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Fri, 15 Aug 2014 21:17:38 +0000 (23:17 +0200)
warnings in the Objects/ subdirectory.

PyType_FromSpecWithBases() and PyType_FromSpec() now reject explicitly negative
slot identifiers.

Objects/exceptions.c
Objects/longobject.c
Objects/setobject.c
Objects/typeobject.c
Objects/unicodeobject.c

index 873fbc61bdb625f79951273ff3cb841638a8e008..5532821aa693493f40e2cee9f8aadd764168844c 100644 (file)
@@ -2714,7 +2714,7 @@ _PyErr_TrySetFromCause(const char *format, ...)
     same_basic_size = (
         caught_type_size == base_exc_size ||
         (PyType_SUPPORTS_WEAKREFS(caught_type) &&
-            (caught_type_size == base_exc_size + sizeof(PyObject *))
+            (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
         )
     );
     if (caught_type->tp_init != (initproc)BaseException_init ||
index c1416a0a93b29707d07d6b6ca14d0b01f3f80267..68dc85fa8fcc650c31acb54ba904c9583eb356e7 100644 (file)
@@ -5094,13 +5094,13 @@ _PyLong_Init(void)
              * to the original refcnt + 1 */
             Py_REFCNT(op) = refcnt + 1;
             assert(Py_SIZE(op) == size);
-            assert(v->ob_digit[0] == abs(ival));
+            assert(v->ob_digit[0] == (digit)abs(ival));
         }
         else {
             (void)PyObject_INIT(v, &PyLong_Type);
         }
         Py_SIZE(v) = size;
-        v->ob_digit[0] = abs(ival);
+        v->ob_digit[0] = (digit)abs(ival);
     }
 #endif
     /* initialize int_info */
index dff15978fc78b328918cbc44cc283acc57277184..8f7542c89ef654b2af5702713965a2ab3d881afa 100644 (file)
@@ -771,7 +771,7 @@ frozenset_hash(PyObject *self)
     /* Make the final result spread-out in a different pattern
        than the algorithm for tuples or other python objects. */
     hash = hash * 69069U + 907133923UL;
-    if (hash == -1)
+    if (hash == (Py_uhash_t)-1)
         hash = 590923713UL;
     so->hash = hash;
     return hash;
index 8e7c25a213ff899be67d3cc4748a4be6380acb68..7438dedfa62ff839a24f409fc346bf182239da9d 100644 (file)
@@ -2622,7 +2622,8 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
     type->tp_itemsize = spec->itemsize;
 
     for (slot = spec->slots; slot->slot; slot++) {
-        if (slot->slot >= Py_ARRAY_LENGTH(slotoffsets)) {
+        if (slot->slot < 0
+            || (size_t)slot->slot >= Py_ARRAY_LENGTH(slotoffsets)) {
             PyErr_SetString(PyExc_RuntimeError, "invalid slot offset");
             goto fail;
         }
@@ -2682,11 +2683,11 @@ PyType_FromSpec(PyType_Spec *spec)
 void *
 PyType_GetSlot(PyTypeObject *type, int slot)
 {
-    if (!PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) {
+    if (!PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE) || slot < 0) {
         PyErr_BadInternalCall();
         return NULL;
     }
-    if (slot >= Py_ARRAY_LENGTH(slotoffsets)) {
+    if ((size_t)slot >= Py_ARRAY_LENGTH(slotoffsets)) {
         /* Extension module requesting slot from a future version */
         return NULL;
     }
index 263ca85b7b7a6f7bc4c36a35ee8d93bbf5ec6b1f..e7ff126630d2cb0629f0e897e84392be8f7d1ee3 100644 (file)
@@ -3519,7 +3519,7 @@ PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len,
     if (locale_error_handler(errors, &surrogateescape) < 0)
         return NULL;
 
-    if (str[len] != '\0' || len != strlen(str)) {
+    if (str[len] != '\0' || (size_t)len != strlen(str)) {
         PyErr_SetString(PyExc_TypeError, "embedded null character");
         return NULL;
     }
@@ -3696,7 +3696,7 @@ PyUnicode_FSConverter(PyObject* arg, void* addr)
     }
     size = PyBytes_GET_SIZE(output);
     data = PyBytes_AS_STRING(output);
-    if (size != strlen(data)) {
+    if ((size_t)size != strlen(data)) {
         PyErr_SetString(PyExc_TypeError, "embedded NUL character");
         Py_DECREF(output);
         return 0;
@@ -8874,7 +8874,7 @@ PyUnicode_TransformDecimalToASCII(Py_UNICODE *s,
 
     maxchar = 127;
     for (i = 0; i < length; i++) {
-        Py_UNICODE ch = s[i];
+        Py_UCS4 ch = s[i];
         if (ch > 127) {
             int decimal = Py_UNICODE_TODECIMAL(ch);
             if (decimal >= 0)
@@ -8891,7 +8891,7 @@ PyUnicode_TransformDecimalToASCII(Py_UNICODE *s,
     data = PyUnicode_DATA(decimal);
     /* Iterate over code points */
     for (i = 0; i < length; i++) {
-        Py_UNICODE ch = s[i];
+        Py_UCS4 ch = s[i];
         if (ch > 127) {
             int decimal = Py_UNICODE_TODECIMAL(ch);
             if (decimal >= 0)
@@ -10833,7 +10833,7 @@ PyUnicode_CompareWithASCIIString(PyObject* uni, const char* str)
         void *data = PyUnicode_DATA(uni);
         /* Compare Unicode string and source character set string */
         for (i = 0; (chr = PyUnicode_READ(kind, data, i)) && str[i]; i++)
-            if (chr != str[i])
+            if (chr != (unsigned char)str[i])
                 return (chr < (unsigned char)(str[i])) ? -1 : 1;
         /* This check keeps Python strings that end in '\0' from comparing equal
          to C strings identical up to that point. */