Fix signedness of char values passed to isspace, iscntrl, isxdigit
authorIvan Maidanski <ivmai@mail.ru>
Sun, 15 Jun 2014 07:39:12 +0000 (11:39 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Sun, 15 Jun 2014 07:39:12 +0000 (11:39 +0400)
(eliminate 'array subscript has type char' GCC warning)

* cord/tests/de_win.c (WinMain, plain_chars, control_chars): Cast char
value to unsigned char when passed to isspace(), iscntrl().
* os_dep.c (GC_parse_map_entry): Change type of "start_start",
"end_start", "maj_dev_start", "p" local variables from char* to
unsgined char* (as isspace(), isxdigit() expect non-negative values);
insert casts between char* and unsigned char* where needed.
* os_dep.c (GC_parse_map_entry): Remove "endp" local variable (use "p"
variable directly instead).

cord/tests/de_win.c
os_dep.c

index f33a5f2..84a5bc7 100644 (file)
@@ -89,7 +89,8 @@ int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    } else {
         char *p = command_line;
 
-        while (*p != 0 && !isspace(*p)) p++;
+        while (*p != 0 && !isspace(*(unsigned char *)p))
+            p++;
         arg_file_name = CORD_to_char_star(
                             CORD_substr(command_line, 0, p - command_line));
    }
@@ -133,7 +134,7 @@ char * plain_chars(char * text, size_t len)
     register size_t i;
 
     for (i = 0; i < len; i++) {
-       if (iscntrl(text[i])) {
+       if (iscntrl(((unsigned char *)text)[i])) {
            result[i] = ' ';
        } else {
            result[i] = text[i];
@@ -151,7 +152,7 @@ char * control_chars(char * text, size_t len)
     register size_t i;
 
     for (i = 0; i < len; i++) {
-       if (iscntrl(text[i])) {
+       if (iscntrl(((unsigned char *)text)[i])) {
            result[i] = text[i] + 0x40;
        } else {
            result[i] = ' ';
index b23644c..4a77d31 100644 (file)
--- a/os_dep.c
+++ b/os_dep.c
@@ -299,30 +299,29 @@ GC_INNER char * GC_get_maps(void)
                                     char **prot, unsigned int *maj_dev,
                                     char **mapping_name)
   {
-    char *start_start, *end_start, *maj_dev_start;
-    char *p;
-    char *endp;
+    unsigned char *start_start, *end_start, *maj_dev_start;
+    unsigned char *p;   /* unsigned for isspace, isxdigit */
 
     if (buf_ptr == NULL || *buf_ptr == '\0') {
         return NULL;
     }
 
-    p = buf_ptr;
+    p = (unsigned char *)buf_ptr;
     while (isspace(*p)) ++p;
     start_start = p;
     GC_ASSERT(isxdigit(*start_start));
-    *start = (ptr_t)strtoul(start_start, &endp, 16); p = endp;
+    *start = (ptr_t)strtoul((char *)start_start, (char **)&p, 16);
     GC_ASSERT(*p=='-');
 
     ++p;
     end_start = p;
     GC_ASSERT(isxdigit(*end_start));
-    *end = (ptr_t)strtoul(end_start, &endp, 16); p = endp;
+    *end = (ptr_t)strtoul((char *)end_start, (char **)&p, 16);
     GC_ASSERT(isspace(*p));
 
     while (isspace(*p)) ++p;
     GC_ASSERT(*p == 'r' || *p == '-');
-    *prot = p;
+    *prot = (char *)p;
     /* Skip past protection field to offset field */
        while (!isspace(*p)) ++p; while (isspace(*p)) ++p;
     GC_ASSERT(isxdigit(*p));
@@ -330,16 +329,16 @@ GC_INNER char * GC_get_maps(void)
           while (!isspace(*p)) ++p; while (isspace(*p)) ++p;
     maj_dev_start = p;
     GC_ASSERT(isxdigit(*maj_dev_start));
-    *maj_dev = strtoul(maj_dev_start, NULL, 16);
+    *maj_dev = strtoul((char *)maj_dev_start, NULL, 16);
 
     if (mapping_name == 0) {
       while (*p && *p++ != '\n');
     } else {
       while (*p && *p != '\n' && *p != '/' && *p != '[') p++;
-      *mapping_name = p;
+      *mapping_name = (char *)p;
       while (*p && *p++ != '\n');
     }
-    return p;
+    return (char *)p;
   }
 #endif /* REDIRECT_MALLOC || DYNAMIC_LOADING || IA64 || ... */