gh-110819: Fix ‘kind’ may be used uninitialized warning in `longobject` (#116599)

This commit is contained in:
Nikita Sobolev 2024-03-12 13:50:06 +03:00 committed by GitHub
parent f8147d01da
commit eb947cdc13
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 35 additions and 28 deletions

View File

@ -1965,7 +1965,9 @@ long_to_decimal_string_internal(PyObject *aa,
digit *pout, *pin, rem, tenpow; digit *pout, *pin, rem, tenpow;
int negative; int negative;
int d; int d;
int kind;
// writer or bytes_writer can be used, but not both at the same time.
assert(writer == NULL || bytes_writer == NULL);
a = (PyLongObject *)aa; a = (PyLongObject *)aa;
if (a == NULL || !PyLong_Check(a)) { if (a == NULL || !PyLong_Check(a)) {
@ -2078,7 +2080,6 @@ long_to_decimal_string_internal(PyObject *aa,
Py_DECREF(scratch); Py_DECREF(scratch);
return -1; return -1;
} }
kind = writer->kind;
} }
else if (bytes_writer) { else if (bytes_writer) {
*bytes_str = _PyBytesWriter_Prepare(bytes_writer, *bytes_str, strlen); *bytes_str = _PyBytesWriter_Prepare(bytes_writer, *bytes_str, strlen);
@ -2093,7 +2094,6 @@ long_to_decimal_string_internal(PyObject *aa,
Py_DECREF(scratch); Py_DECREF(scratch);
return -1; return -1;
} }
kind = PyUnicode_KIND(str);
} }
#define WRITE_DIGITS(p) \ #define WRITE_DIGITS(p) \
@ -2141,19 +2141,23 @@ long_to_decimal_string_internal(PyObject *aa,
WRITE_DIGITS(p); WRITE_DIGITS(p);
assert(p == *bytes_str); assert(p == *bytes_str);
} }
else if (kind == PyUnicode_1BYTE_KIND) {
Py_UCS1 *p;
WRITE_UNICODE_DIGITS(Py_UCS1);
}
else if (kind == PyUnicode_2BYTE_KIND) {
Py_UCS2 *p;
WRITE_UNICODE_DIGITS(Py_UCS2);
}
else { else {
Py_UCS4 *p; int kind = writer ? writer->kind : PyUnicode_KIND(str);
assert (kind == PyUnicode_4BYTE_KIND); if (kind == PyUnicode_1BYTE_KIND) {
WRITE_UNICODE_DIGITS(Py_UCS4); Py_UCS1 *p;
WRITE_UNICODE_DIGITS(Py_UCS1);
}
else if (kind == PyUnicode_2BYTE_KIND) {
Py_UCS2 *p;
WRITE_UNICODE_DIGITS(Py_UCS2);
}
else {
assert (kind == PyUnicode_4BYTE_KIND);
Py_UCS4 *p;
WRITE_UNICODE_DIGITS(Py_UCS4);
}
} }
#undef WRITE_DIGITS #undef WRITE_DIGITS
#undef WRITE_UNICODE_DIGITS #undef WRITE_UNICODE_DIGITS
@ -2194,11 +2198,12 @@ long_format_binary(PyObject *aa, int base, int alternate,
PyObject *v = NULL; PyObject *v = NULL;
Py_ssize_t sz; Py_ssize_t sz;
Py_ssize_t size_a; Py_ssize_t size_a;
int kind;
int negative; int negative;
int bits; int bits;
assert(base == 2 || base == 8 || base == 16); assert(base == 2 || base == 8 || base == 16);
// writer or bytes_writer can be used, but not both at the same time.
assert(writer == NULL || bytes_writer == NULL);
if (a == NULL || !PyLong_Check(a)) { if (a == NULL || !PyLong_Check(a)) {
PyErr_BadInternalCall(); PyErr_BadInternalCall();
return -1; return -1;
@ -2246,7 +2251,6 @@ long_format_binary(PyObject *aa, int base, int alternate,
if (writer) { if (writer) {
if (_PyUnicodeWriter_Prepare(writer, sz, 'x') == -1) if (_PyUnicodeWriter_Prepare(writer, sz, 'x') == -1)
return -1; return -1;
kind = writer->kind;
} }
else if (bytes_writer) { else if (bytes_writer) {
*bytes_str = _PyBytesWriter_Prepare(bytes_writer, *bytes_str, sz); *bytes_str = _PyBytesWriter_Prepare(bytes_writer, *bytes_str, sz);
@ -2257,7 +2261,6 @@ long_format_binary(PyObject *aa, int base, int alternate,
v = PyUnicode_New(sz, 'x'); v = PyUnicode_New(sz, 'x');
if (v == NULL) if (v == NULL)
return -1; return -1;
kind = PyUnicode_KIND(v);
} }
#define WRITE_DIGITS(p) \ #define WRITE_DIGITS(p) \
@ -2318,19 +2321,23 @@ long_format_binary(PyObject *aa, int base, int alternate,
WRITE_DIGITS(p); WRITE_DIGITS(p);
assert(p == *bytes_str); assert(p == *bytes_str);
} }
else if (kind == PyUnicode_1BYTE_KIND) {
Py_UCS1 *p;
WRITE_UNICODE_DIGITS(Py_UCS1);
}
else if (kind == PyUnicode_2BYTE_KIND) {
Py_UCS2 *p;
WRITE_UNICODE_DIGITS(Py_UCS2);
}
else { else {
Py_UCS4 *p; int kind = writer ? writer->kind : PyUnicode_KIND(v);
assert (kind == PyUnicode_4BYTE_KIND); if (kind == PyUnicode_1BYTE_KIND) {
WRITE_UNICODE_DIGITS(Py_UCS4); Py_UCS1 *p;
WRITE_UNICODE_DIGITS(Py_UCS1);
}
else if (kind == PyUnicode_2BYTE_KIND) {
Py_UCS2 *p;
WRITE_UNICODE_DIGITS(Py_UCS2);
}
else {
assert (kind == PyUnicode_4BYTE_KIND);
Py_UCS4 *p;
WRITE_UNICODE_DIGITS(Py_UCS4);
}
} }
#undef WRITE_DIGITS #undef WRITE_DIGITS
#undef WRITE_UNICODE_DIGITS #undef WRITE_UNICODE_DIGITS