From 4f68061c52bd42ed5763edff6d63facbd97abec6 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Thu, 13 Apr 2017 00:34:30 +0800 Subject: [PATCH 1/2] resolve some undefined behaviours --- Modules/_struct.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Modules/_struct.c b/Modules/_struct.c index 4bc41869234fbb..75d34292aaeb60 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -552,6 +552,7 @@ static int np_ubyte(char *p, PyObject *v, const formatdef *f) { long x; + unsigned char y; if (get_long(v, &x) < 0) return -1; if (x < 0 || x > 255){ @@ -559,7 +560,8 @@ np_ubyte(char *p, PyObject *v, const formatdef *f) "ubyte format requires 0 <= number <= 255"); return -1; } - *p = (char)x; + y = (unsigned char)x; + *p = *((char *)&y); return 0; } @@ -900,7 +902,8 @@ bp_int(char *p, PyObject *v, const formatdef *f) #endif } do { - p[--i] = (char)x; + unsigned char y = (unsigned char)(x & 0xffL); + p[--i] = *((char *)&y); x >>= 8; } while (i > 0); return 0; @@ -921,7 +924,8 @@ bp_uint(char *p, PyObject *v, const formatdef *f) RANGE_ERROR(x, f, 1, maxint - 1); } do { - p[--i] = (char)x; + unsigned char y = (unsigned char)(x & 0xffUL); + p[--i] = *((char *)&y); x >>= 8; } while (i > 0); return 0; @@ -1119,7 +1123,8 @@ lp_int(char *p, PyObject *v, const formatdef *f) #endif } do { - *p++ = (char)x; + unsigned char y = (unsigned char)(x & 0xffL); + *p++ = *((char *)&y); x >>= 8; } while (--i > 0); return 0; @@ -1140,7 +1145,8 @@ lp_uint(char *p, PyObject *v, const formatdef *f) RANGE_ERROR(x, f, 1, maxint - 1); } do { - *p++ = (char)x; + unsigned char y = (unsigned char)(x & 0xffUL); + *p++ = *((char *)&y); x >>= 8; } while (--i > 0); return 0; From 86397aac7de69b42e6926a434bf4244c6542fe1f Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Wed, 3 May 2017 13:51:12 +0800 Subject: [PATCH 2/2] change p to unsigned char * --- Modules/_struct.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Modules/_struct.c b/Modules/_struct.c index 75d34292aaeb60..d9c6d11003d58b 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -552,7 +552,6 @@ static int np_ubyte(char *p, PyObject *v, const formatdef *f) { long x; - unsigned char y; if (get_long(v, &x) < 0) return -1; if (x < 0 || x > 255){ @@ -560,8 +559,7 @@ np_ubyte(char *p, PyObject *v, const formatdef *f) "ubyte format requires 0 <= number <= 255"); return -1; } - y = (unsigned char)x; - *p = *((char *)&y); + *(unsigned char *)p = (unsigned char)x; return 0; } @@ -890,6 +888,7 @@ bp_int(char *p, PyObject *v, const formatdef *f) { long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_long(v, &x) < 0) return -1; i = f->size; @@ -902,8 +901,7 @@ bp_int(char *p, PyObject *v, const formatdef *f) #endif } do { - unsigned char y = (unsigned char)(x & 0xffL); - p[--i] = *((char *)&y); + q[--i] = (unsigned char)(x & 0xffL); x >>= 8; } while (i > 0); return 0; @@ -914,6 +912,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f) { unsigned long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_ulong(v, &x) < 0) return -1; i = f->size; @@ -924,8 +923,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f) RANGE_ERROR(x, f, 1, maxint - 1); } do { - unsigned char y = (unsigned char)(x & 0xffUL); - p[--i] = *((char *)&y); + q[--i] = (unsigned char)(x & 0xffUL); x >>= 8; } while (i > 0); return 0; @@ -1111,6 +1109,7 @@ lp_int(char *p, PyObject *v, const formatdef *f) { long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_long(v, &x) < 0) return -1; i = f->size; @@ -1123,8 +1122,7 @@ lp_int(char *p, PyObject *v, const formatdef *f) #endif } do { - unsigned char y = (unsigned char)(x & 0xffL); - *p++ = *((char *)&y); + *q++ = (unsigned char)(x & 0xffL); x >>= 8; } while (--i > 0); return 0; @@ -1135,6 +1133,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f) { unsigned long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_ulong(v, &x) < 0) return -1; i = f->size; @@ -1145,8 +1144,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f) RANGE_ERROR(x, f, 1, maxint - 1); } do { - unsigned char y = (unsigned char)(x & 0xffUL); - *p++ = *((char *)&y); + *q++ = (unsigned char)(x & 0xffUL); x >>= 8; } while (--i > 0); return 0;