summaryrefslogtreecommitdiffstatshomepage
path: root/py/parsenum.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-06-14 17:56:44 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-06-14 18:02:21 +0300
commit0294661da5b68cd428362fb81513d11471e6a24a (patch)
tree4f39fda5bfc2857cdc16fcad0cf6b35cf6ce74d6 /py/parsenum.c
parent812025bd8317d520006dd71ab6404edb6df29352 (diff)
downloadmicropython-0294661da5b68cd428362fb81513d11471e6a24a.tar.gz
micropython-0294661da5b68cd428362fb81513d11471e6a24a.zip
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.
Diffstat (limited to 'py/parsenum.c')
-rw-r--r--py/parsenum.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/py/parsenum.c b/py/parsenum.c
index 2e513e5159..1c1868ae0a 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 @@ mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base) {
}
// 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 @@ have_ret_val:
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;
}