parsenum: Signedness issues.
char can be signedness, and using signedness types is dangerous - it can
lead to negative offsets when doing table lookups. We apparently should just
ban char usage.
diff --git a/py/parsenum.c b/py/parsenum.c
index 2e513e5..1c1868a 100644
--- a/py/parsenum.c
+++ b/py/parsenum.c
@@ -40,8 +40,9 @@
#include <math.h>
#endif
-mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base) {
- const char *restrict top = str + len;
+mp_obj_t mp_parse_num_integer(const char *restrict str_, uint len, int base) {
+ const byte *restrict str = (const byte *)str_;
+ const byte *restrict top = str + len;
bool neg = false;
mp_obj_t ret_val;
@@ -65,11 +66,11 @@
}
// parse optional base prefix
- str += mp_parse_num_base(str, top - str, &base);
+ str += mp_parse_num_base((const char*)str, top - str, &base);
// string should be an integer number
machine_int_t int_val = 0;
- const char *restrict str_val_start = str;
+ const byte *restrict str_val_start = str;
for (; str < top; str++) {
// get next digit as a value
int dig = *str;
@@ -129,9 +130,9 @@
overflow:
// reparse using long int
{
- const char *s2 = str_val_start;
+ const char *s2 = (const char*)str_val_start;
ret_val = mp_obj_new_int_from_str_len(&s2, top - str_val_start, neg, base);
- str = s2;
+ str = (const byte*)s2;
goto have_ret_val;
}