Hi, everyone.

I've been auditing the OpenBSD codebase for calls to ctype functions
with potentially signed chars. This is undefined on some platforms. I
found a number of instances in Sqlite, so I cloned your repo and ran my
script on it.

Here's the relevant CERT entry:

        
https://www.securecoding.cert.org/confluence/display/c/STR37-C.+Arguments+to+character-handling+functions+must+be+representable+as+an+unsigned+char

The below diff was generated by Coccinelle, an extremely useful
automated tool, so some of the formatting may be odd and mistakes are
possible.

Let me know what you think.

Thanks,
Michael


Index: autoconf/tea/win/nmakehlp.c
==================================================================
--- autoconf/tea/win/nmakehlp.c
+++ autoconf/tea/win/nmakehlp.c
@@ -603,15 +603,15 @@
        sp = fopen(substitutions, "rt");
        if (sp != NULL) {
            while (fgets(szBuffer, cbBuffer, sp) != NULL) {
                char *ks, *ke, *vs, *ve;
                ks = szBuffer;
-               while (ks && *ks && isspace(*ks)) ++ks;
+               while (ks && *ks && isspace((unsigned char)*ks)) ++ks;
                ke = ks;
-               while (ke && *ke && !isspace(*ke)) ++ke;
+               while (ke && *ke && !isspace((unsigned char)*ke)) ++ke;
                vs = ke;
-               while (vs && *vs && isspace(*vs)) ++vs;
+               while (vs && *vs && isspace((unsigned char)*vs)) ++vs;
                ve = vs;
                while (ve && *ve && !(*ve == '\r' || *ve == '\n')) ++ve;
                *ke = 0, *ve = 0;
                list_insert(&substPtr, ks, vs);
            }

Index: ext/fts1/fts1.c
==================================================================
--- ext/fts1/fts1.c
+++ ext/fts1/fts1.c
@@ -203,17 +203,17 @@
 ** tokenizer-generated tokens rather than doing its own local
 ** tokenization.
 */
 /* TODO(shess) Is __isascii() a portable version of (c&0x80)==0? */
 static int safe_isspace(char c){
-  return (c&0x80)==0 ? isspace(c) : 0;
+  return (c&0x80)==0 ? isspace((unsigned char)c) : 0;
 }
 static int safe_tolower(char c){
-  return (c&0x80)==0 ? tolower(c) : c;
+  return (c&0x80)==0 ? tolower((unsigned char)c) : c;
 }
 static int safe_isalnum(char c){
-  return (c&0x80)==0 ? isalnum(c) : 0;
+  return (c&0x80)==0 ? isalnum((unsigned char)c) : 0;
 }

 typedef enum DocListType {
   DL_DOCIDS,              /* docids only */
   DL_POSITIONS,           /* docids + positions */

Index: ext/fts1/simple_tokenizer.c
==================================================================
--- ext/fts1/simple_tokenizer.c
+++ ext/fts1/simple_tokenizer.c
@@ -136,11 +136,11 @@
       for(ii=0; ii<n; ii++){
         /* TODO(shess) This needs expansion to handle UTF-8
         ** case-insensitivity.
         */
         char ch = c->pCurrent[ii];
-        c->zToken[ii] = (unsigned char)ch<0x80 ? tolower(ch) : ch;
+        c->zToken[ii] = (unsigned char)ch<0x80 ? tolower((unsigned char)ch) : 
ch;
       }
       c->zToken[n] = '\0';
       *ppToken = c->zToken;
       *pnBytes = n;
       *piStartOffset = (int) (c->pCurrent-c->pInput);

Index: ext/misc/amatch.c
==================================================================
--- ext/misc/amatch.c
+++ ext/misc/amatch.c
@@ -814,14 +814,14 @@
   int nKey = (int)strlen(zKey);
   int nStr = (int)strlen(zStr);
   int i;
   if( nStr<nKey+1 ) return 0;
   if( memcmp(zStr, zKey, nKey)!=0 ) return 0;
-  for(i=nKey; isspace(zStr[i]); i++){}
+  for(i=nKey; isspace((unsigned char)zStr[i]); i++){}
   if( zStr[i]!='=' ) return 0;
   i++;
-  while( isspace(zStr[i]) ){ i++; }
+  while( isspace((unsigned char)zStr[i]) ){ i++; }
   return zStr+i;
 }

 /*
 ** xConnect/xCreate method for the amatch module. Arguments are:

Index: ext/misc/closure.c
==================================================================
--- ext/misc/closure.c
+++ ext/misc/closure.c
@@ -484,14 +484,14 @@
   int nKey = (int)strlen(zKey);
   int nStr = (int)strlen(zStr);
   int i;
   if( nStr<nKey+1 ) return 0;
   if( memcmp(zStr, zKey, nKey)!=0 ) return 0;
-  for(i=nKey; isspace(zStr[i]); i++){}
+  for(i=nKey; isspace((unsigned char)zStr[i]); i++){}
   if( zStr[i]!='=' ) return 0;
   i++;
-  while( isspace(zStr[i]) ){ i++; }
+  while( isspace((unsigned char)zStr[i]) ){ i++; }
   return zStr+i;
 }

 /*
 ** xConnect/xCreate method for the closure module. Arguments are:

Index: ext/misc/spellfix.c
==================================================================
--- ext/misc/spellfix.c
+++ ext/misc/spellfix.c
@@ -1849,11 +1849,11 @@
 */
 static char *spellfix1Dequote(const char *zIn){
   char *zOut;
   int i, j;
   char c;
-  while( isspace(zIn[0]) ) zIn++;
+  while( isspace((unsigned char)zIn[0]) ) zIn++;
   zOut = sqlite3_mprintf("%s", zIn);
   if( zOut==0 ) return 0;
   i = (int)strlen(zOut);
 #if 0  /* The parser will never leave spaces at the end */
   while( i>0 && isspace(zOut[i-1]) ){ i--; }

Index: mptest/mptest.c
==================================================================
--- mptest/mptest.c
+++ mptest/mptest.c
@@ -185,14 +185,14 @@
         }
         c2 = *(zGlob++);
       }
       if( c2==0 || (seen ^ invert)==0 ) return 0;
     }else if( c=='#' ){
-      if( (z[0]=='-' || z[0]=='+') && isdigit(z[1]) ) z++;
-      if( !isdigit(z[0]) ) return 0;
+      if( (z[0]=='-' || z[0]=='+') && isdigit((unsigned char)z[1]) ) z++;
+      if( !isdigit((unsigned char)z[0]) ) return 0;
       z++;
-      while( isdigit(z[0]) ){ z++; }
+      while( isdigit((unsigned char)z[0]) ){ z++; }
     }else{
       if( c!=(*(z++)) ) return 0;
     }
   }
   return *z==0;
@@ -287,11 +287,11 @@
 /*
 ** Return the length of a string omitting trailing whitespace
 */
 static int clipLength(const char *z){
   int n = (int)strlen(z);
-  while( n>0 && isspace(z[n-1]) ){ n--; }
+  while( n>0 && isspace((unsigned char)z[n - 1]) ){ n--; }
   return n;
 }

 /*
 ** Auxiliary SQL function to return the name of the VFS
@@ -442,11 +442,11 @@
   if( p->n ) stringAppend(p, " ", 1);
   if( z==0 ){
     stringAppend(p, "nil", 3);
     return;
   }
-  for(i=0; z[i] && !isspace(z[i]); i++){}
+  for(i=0; z[i] && !isspace((unsigned char)z[i]); i++){}
   if( i>0 && z[i]==0 ){
     stringAppend(p, z, i);
     return;
   }
   stringAppend(p, "'", 1);
@@ -697,11 +697,11 @@
 /*
 ** Return the length of the next token.
 */
 static int tokenLength(const char *z, int *pnLine){
   int n = 0;
-  if( isspace(z[0]) || (z[0]=='/' && z[1]=='*') ){
+  if( isspace((unsigned char)z[0]) || (z[0]=='/' && z[1]=='*') ){
     int inC = 0;
     int c;
     if( z[0]=='/' ){
       inC = 1;
       n = 2;
@@ -746,21 +746,21 @@
   int i;
   if( nIn<=0 ){
     zOut[0] = 0;
     return 0;
   }
-  for(i=0; i<nIn && i<nOut-1 && !isspace(zIn[i]); i++){ zOut[i] = zIn[i]; }
+  for(i=0; i<nIn && i<nOut-1 && !isspace((unsigned char)zIn[i]); i++){ zOut[i] 
= zIn[i]; }
   zOut[i] = 0;
   return i;
 }

 /*
 ** Find the number of characters up to the start of the next "--end" token.
 */
 static int findEnd(const char *z, int *pnLine){
   int n = 0;
-  while( z[n] && (strncmp(z+n,"--end",5) || !isspace(z[n+5])) ){
+  while( z[n] && (strncmp(z+n,"--end",5) || !isspace((unsigned char)z[n + 5])) 
){
     n += tokenLength(z+n, pnLine);
   }
   return n;
 }

@@ -771,16 +771,16 @@
 */
 static int findEndif(const char *z, int stopAtElse, int *pnLine){
   int n = 0;
   while( z[n] ){
     int len = tokenLength(z+n, pnLine);
-    if( (strncmp(z+n,"--endif",7)==0 && isspace(z[n+7]))
-     || (stopAtElse && strncmp(z+n,"--else",6)==0 && isspace(z[n+6]))
+    if( (strncmp(z+n,"--endif",7)==0 && isspace((unsigned char)z[n + 7]))
+       || (stopAtElse && strncmp(z+n,"--else",6)==0 && isspace((unsigned 
char)z[n + 6]))
     ){
       return n+len;
     }
-    if( strncmp(z+n,"--if",4)==0 && isspace(z[n+4]) ){
+    if( strncmp(z+n,"--if",4)==0 && isspace((unsigned char)z[n + 4]) ){
       int skip = findEndif(z+n+len, 0, pnLine);
       n += skip + len;
     }else{
       n += len;
     }
@@ -890,11 +890,11 @@
     len = tokenLength(zScript+ii, &lineno);
     if( isspace(c) || (c=='/' && zScript[ii+1]=='*') ){
       ii += len;
       continue;
     }
-    if( c!='-' || zScript[ii+1]!='-' || !isalpha(zScript[ii+2]) ){
+    if( c!='-' || zScript[ii+1]!='-' || !isalpha((unsigned char)zScript[ii + 
2]) ){
       ii += len;
       continue;
     }

     /* Run any prior SQL before processing the new --command */
@@ -907,11 +907,11 @@

     /* Parse the --command */
     if( g.iTrace>=2 ) logMessage("%.*s", len, zScript+ii);
     n = extractToken(zScript+ii+2, len-2, zCmd, sizeof(zCmd));
     for(nArg=0; n<len-2 && nArg<MX_ARG; nArg++){
-      while( n<len-2 && isspace(zScript[ii+2+n]) ){ n++; }
+      while( n<len-2 && isspace((unsigned char)zScript[ii + 2 + n]) ){ n++; }
       if( n>=len-2 ) break;
       n += extractToken(zScript+ii+2+n, len-2-n,
                         azArg[nArg], sizeof(azArg[nArg]));
     }
     for(j=nArg; j<MX_ARG; j++) azArg[j++][0] = 0;
@@ -974,11 +974,11 @@
     ** Check to see if output matches ANSWER.  Report an error if not.
     */
     if( strcmp(zCmd, "match")==0 ){
       int jj;
       char *zAns = zScript+ii;
-      for(jj=7; jj<len-1 && isspace(zAns[jj]); jj++){}
+      for(jj=7; jj<len-1 && isspace((unsigned char)zAns[jj]); jj++){}
       zAns += jj;
       if( len-jj-1!=sResult.n || strncmp(sResult.z, zAns, len-jj-1) ){
         errorMessage("line %d of %s:\nExpected [%.*s]\n     Got [%s]",
           prevLine, zFilename, len-jj-1, zAns, sResult.z);
       }
@@ -996,11 +996,11 @@
     if( strcmp(zCmd, "glob")==0 || strcmp(zCmd, "notglob")==0 ){
       int jj;
       char *zAns = zScript+ii;
       char *zCopy;
       int isGlob = (zCmd[0]=='g');
-      for(jj=9-3*isGlob; jj<len-1 && isspace(zAns[jj]); jj++){}
+      for(jj=9-3*isGlob; jj<len-1 && isspace((unsigned char)zAns[jj]); jj++){}
       zAns += jj;
       zCopy = sqlite3_mprintf("%.*s", len-jj-1, zAns);
       if( (sqlite3_strglob(zCopy, sResult.z)==0)^isGlob ){
         errorMessage("line %d of %s:\nExpected [%s]\n     Got [%s]",
           prevLine, zFilename, zCopy, sResult.z);
@@ -1048,11 +1048,11 @@
     **
     ** Output the remainder of the line to the log file
     */
     if( strcmp(zCmd, "print")==0 ){
       int jj;
-      for(jj=7; jj<len && isspace(zScript[ii+jj]); jj++){}
+      for(jj=7; jj<len && isspace((unsigned char)zScript[ii + jj]); jj++){}
       logMessage("%.*s", len-jj, zScript+ii+jj);
     }else

     /*
     **  --if EXPR
@@ -1060,11 +1060,11 @@
     ** Skip forward to the next matching --endif or --else if EXPR is false.
     */
     if( strcmp(zCmd, "if")==0 ){
       int jj, rc;
       sqlite3_stmt *pStmt;
-      for(jj=4; jj<len && isspace(zScript[ii+jj]); jj++){}
+      for(jj=4; jj<len && isspace((unsigned char)zScript[ii + jj]); jj++){}
       pStmt = prepareSql("SELECT %.*s", len-jj, zScript+ii+jj);
       rc = sqlite3_step(pStmt);
       if( rc!=SQLITE_ROW || sqlite3_column_int(pStmt, 0)==0 ){
         ii += findEndif(zScript+ii+len, 1, &lineno);
       }

Index: test/fuzzcheck.c
==================================================================
--- test/fuzzcheck.c
+++ test/fuzzcheck.c
@@ -631,13 +631,13 @@
     sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zMore);
     if( zMore==zSql ) break;
     if( runFlags & SQL_TRACE ){
       const char *z = zSql;
       int n;
-      while( z<zMore && isspace(z[0]) ) z++;
+      while( z<zMore && isspace((unsigned char)z[0]) ) z++;
       n = (int)(zMore - z);
-      while( n>0 && isspace(z[n-1]) ) n--;
+      while( n>0 && isspace((unsigned char)z[n - 1]) ) n--;
       if( n==0 ) break;
       if( pStmt==0 ){
         printf("TRACE: %.*s (error: %s)\n", n, z, sqlite3_errmsg(db));
       }else{
         printf("TRACE: %.*s\n", n, z);
@@ -755,11 +755,11 @@
     while( (x = hexDigitValue(zArg[0]))>=0 ){
       v = (v<<4) + x;
       zArg++;
     }
   }else{
-    while( isdigit(zArg[0]) ){
+    while( isdigit((unsigned char)zArg[0]) ){
       v = v*10 + zArg[0] - '0';
       zArg++;
     }
   }
   for(i=0; i<sizeof(aMult)/sizeof(aMult[0]); i++){

Index: test/speedtest1.c
==================================================================
--- test/speedtest1.c
+++ test/speedtest1.c
@@ -133,11 +133,11 @@
     while( (x = hexDigitValue(zArg[0]))>=0 ){
       v = (v<<4) + x;
       zArg++;
     }
   }else{
-    while( isdigit(zArg[0]) ){
+    while( isdigit((unsigned char)zArg[0]) ){
       v = v*10 + zArg[0] - '0';
       zArg++;
     }
   }
   for(i=0; i<sizeof(aMult)/sizeof(aMult[0]); i++){
@@ -313,11 +313,11 @@
 }

 /* Print an SQL statement to standard output */
 static void printSql(const char *zSql){
   int n = (int)strlen(zSql);
-  while( n>0 && (zSql[n-1]==';' || isspace(zSql[n-1])) ){ n--; }
+  while( n>0 && (zSql[n-1]==';' || isspace((unsigned char)zSql[n - 1])) ){ 
n--; }
   if( g.bExplain ) printf("EXPLAIN ");
   printf("%.*s;\n", n, zSql);
   if( g.bExplain
 #if SQLITE_VERSION_NUMBER>=3007017 
    && ( sqlite3_strglob("CREATE *", zSql)==0
@@ -412,11 +412,11 @@
 }

 /* The sqlite3_trace() callback function */
 static void traceCallback(void *NotUsed, const char *zSql){
   int n = (int)strlen(zSql);
-  while( n>0 && (zSql[n-1]==';' || isspace(zSql[n-1])) ) n--;
+  while( n>0 && (zSql[n-1]==';' || isspace((unsigned char)zSql[n - 1])) ) n--;
   fprintf(stderr,"%.*s;\n", n, zSql);
 }

 /* Substitute random() function that gives the same random
 ** sequence on each run, for repeatability. */

Index: test/wordcount.c
==================================================================
--- test/wordcount.c
+++ test/wordcount.c
@@ -390,12 +390,12 @@
   }

   /* Process the input file */
   while( fgets(zInput, sizeof(zInput), in) ){
     for(i=0; zInput[i]; i++){
-      if( !isalpha(zInput[i]) ) continue;
-      for(j=i+1; isalpha(zInput[j]); j++){}
+      if( !isalpha((unsigned char)zInput[i]) ) continue;
+      for(j=i+1; isalpha((unsigned char)zInput[j]); j++){}

       /* Found a new word at zInput[i] that is j-i bytes long. 
       ** Process it into the wordcount table.  */
       if( iMode==MODE_DELETE ){
         sqlite3_bind_text(pDelete, 1, zInput+i, j-i, SQLITE_STATIC);

Index: tool/fuzzershell.c
==================================================================
--- tool/fuzzershell.c
+++ tool/fuzzershell.c
@@ -381,11 +381,11 @@
     while( (x = hexDigitValue(zArg[0]))>=0 ){
       v = (v<<4) + x;
       zArg++;
     }
   }else{
-    while( isdigit(zArg[0]) ){
+    while( isdigit((unsigned char)zArg[0]) ){
       v = v*10 + zArg[0] - '0';
       zArg++;
     }
   }
   for(i=0; i<sizeof(aMult)/sizeof(aMult[0]); i++){

Index: tool/lemon.c
==================================================================
--- tool/lemon.c
+++ tool/lemon.c
@@ -91,13 +91,13 @@
   for(i=j=0; (c = zFormat[i])!=0; i++){
     if( c=='%' ){
       int iWidth = 0;
       lemon_addtext(str, &nUsed, &zFormat[j], i-j, 0);
       c = zFormat[++i];
-      if( isdigit(c) || (c=='-' && isdigit(zFormat[i+1])) ){
+      if( isdigit(c) || (c=='-' && isdigit((unsigned char)zFormat[i + 1])) ){
         if( c=='-' ) i++;
-        while( isdigit(zFormat[i]) ) iWidth = iWidth*10 + zFormat[i++] - '0';
+        while( isdigit((unsigned char)zFormat[i]) ) iWidth = iWidth*10 + 
zFormat[i++] - '0';
         if( c=='-' ) iWidth = -iWidth;
         c = zFormat[i];
       }
       if( c=='d' ){
         int v = va_arg(ap, int);
@@ -1576,11 +1576,11 @@
   qsort(lem.symbols,lem.nsymbol,sizeof(struct symbol*), Symbolcmpp);
   for(i=0; i<lem.nsymbol; i++) lem.symbols[i]->index = i;
   while( lem.symbols[i-1]->type==MULTITERMINAL ){ i--; }
   assert( strcmp(lem.symbols[i-1]->name,"{default}")==0 );
   lem.nsymbol = i - 1;
-  for(i=1; isupper(lem.symbols[i]->name[0]); i++);
+  for(i=1; isupper((unsigned char)lem.symbols[i]->name[0]); i++);
   lem.nterminal = i;

   /* Generate a reprint of the grammar, if requested on the command line */
   if( rpflag ){
     Reprint(&lem);
@@ -2119,11 +2119,11 @@
       psp->gp->nrule = 0;
       /* Fall thru to next case */
     case WAITING_FOR_DECL_OR_RULE:
       if( x[0]=='%' ){
         psp->state = WAITING_FOR_DECL_KEYWORD;
-      }else if( islower(x[0]) ){
+      }else if( islower((unsigned char)x[0]) ){
         psp->lhs = Symbol_new(x);
         psp->nrhs = 0;
         psp->lhsalias = 0;
         psp->state = WAITING_FOR_ARROW;
       }else if( x[0]=='{' ){
@@ -2149,11 +2149,11 @@
           x);
         psp->errorcnt++;
       }
       break;
     case PRECEDENCE_MARK_1:
-      if( !isupper(x[0]) ){
+      if( !isupper((unsigned char)x[0]) ){
         ErrorMsg(psp->filename,psp->tokenlineno,
           "The precedence symbol must be a terminal.");
         psp->errorcnt++;
       }else if( psp->prevrule==0 ){
         ErrorMsg(psp->filename,psp->tokenlineno,
@@ -2189,11 +2189,11 @@
         psp->errorcnt++;
         psp->state = RESYNC_AFTER_RULE_ERROR;
       }
       break;
     case LHS_ALIAS_1:
-      if( isalpha(x[0]) ){
+      if( isalpha((unsigned char)x[0]) ){
         psp->lhsalias = x;
         psp->state = LHS_ALIAS_2;
       }else{
         ErrorMsg(psp->filename,psp->tokenlineno,
           "\"%s\" is not a valid alias for the LHS \"%s\"\n",
@@ -2258,11 +2258,11 @@
             psp->lastrule = rp;
           }
           psp->prevrule = rp;
         }
         psp->state = WAITING_FOR_DECL_OR_RULE;
-      }else if( isalpha(x[0]) ){
+      }else if( isalpha((unsigned char)x[0]) ){
         if( psp->nrhs>=MAXRHS ){
           ErrorMsg(psp->filename,psp->tokenlineno,
             "Too many symbols on RHS of rule beginning at \"%s\".",
             x);
           psp->errorcnt++;
@@ -2287,11 +2287,11 @@
         }
         msp->nsubsym++;
         msp->subsym = (struct symbol **) realloc(msp->subsym,
           sizeof(struct symbol*)*msp->nsubsym);
         msp->subsym[msp->nsubsym-1] = Symbol_new(&x[1]);
-        if( islower(x[1]) || islower(msp->subsym[0]->name[0]) ){
+        if( islower((unsigned char)x[1]) || islower((unsigned 
char)msp->subsym[0]->name[0]) ){
           ErrorMsg(psp->filename,psp->tokenlineno,
             "Cannot form a compound containing a non-terminal");
           psp->errorcnt++;
         }
       }else if( x[0]=='(' && psp->nrhs>0 ){
@@ -2302,11 +2302,11 @@
         psp->errorcnt++;
         psp->state = RESYNC_AFTER_RULE_ERROR;
       }
       break;
     case RHS_ALIAS_1:
-      if( isalpha(x[0]) ){
+      if( isalpha((unsigned char)x[0]) ){
         psp->alias[psp->nrhs-1] = x;
         psp->state = RHS_ALIAS_2;
       }else{
         ErrorMsg(psp->filename,psp->tokenlineno,
           "\"%s\" is not a valid alias for the RHS symbol \"%s\"\n",
@@ -2324,11 +2324,11 @@
         psp->errorcnt++;
         psp->state = RESYNC_AFTER_RULE_ERROR;
       }
       break;
     case WAITING_FOR_DECL_KEYWORD:
-      if( isalpha(x[0]) ){
+      if( isalpha((unsigned char)x[0]) ){
         psp->declkeyword = x;
         psp->declargslot = 0;
         psp->decllinenoslot = 0;
         psp->insertLineMacro = 1;
         psp->state = WAITING_FOR_DECL_ARG;
@@ -2404,11 +2404,11 @@
         psp->errorcnt++;
         psp->state = RESYNC_AFTER_DECL_ERROR;
       }
       break;
     case WAITING_FOR_DESTRUCTOR_SYMBOL:
-      if( !isalpha(x[0]) ){
+      if( !isalpha((unsigned char)x[0]) ){
         ErrorMsg(psp->filename,psp->tokenlineno,
           "Symbol name missing after %%destructor keyword");
         psp->errorcnt++;
         psp->state = RESYNC_AFTER_DECL_ERROR;
       }else{
@@ -2418,11 +2418,11 @@
         psp->insertLineMacro = 1;
         psp->state = WAITING_FOR_DECL_ARG;
       }
       break;
     case WAITING_FOR_DATATYPE_SYMBOL:
-      if( !isalpha(x[0]) ){
+      if( !isalpha((unsigned char)x[0]) ){
         ErrorMsg(psp->filename,psp->tokenlineno,
           "Symbol name missing after %%type keyword");
         psp->errorcnt++;
         psp->state = RESYNC_AFTER_DECL_ERROR;
       }else{
@@ -2443,11 +2443,11 @@
       }
       break;
     case WAITING_FOR_PRECEDENCE_SYMBOL:
       if( x[0]=='.' ){
         psp->state = WAITING_FOR_DECL_OR_RULE;
-      }else if( isupper(x[0]) ){
+      }else if( isupper((unsigned char)x[0]) ){
         struct symbol *sp;
         sp = Symbol_new(x);
         if( sp->prec>=0 ){
           ErrorMsg(psp->filename,psp->tokenlineno,
             "Symbol \"%s\" has already be given a precedence.",x);
@@ -2461,11 +2461,11 @@
           "Can't assign a precedence to \"%s\".",x);
         psp->errorcnt++;
       }
       break;
     case WAITING_FOR_DECL_ARG:
-      if( x[0]=='{' || x[0]=='\"' || isalnum(x[0]) ){
+      if( x[0]=='{' || x[0]=='\"' || isalnum((unsigned char)x[0]) ){
         const char *zOld, *zNew;
         char *zBuf, *z;
         int nOld, n, nLine = 0, nNew, nBack;
         int addLineMacro;
         char zLine[50];
@@ -2522,11 +2522,11 @@
       }
       break;
     case WAITING_FOR_FALLBACK_ID:
       if( x[0]=='.' ){
         psp->state = WAITING_FOR_DECL_OR_RULE;
-      }else if( !isupper(x[0]) ){
+      }else if( !isupper((unsigned char)x[0]) ){
         ErrorMsg(psp->filename, psp->tokenlineno,
           "%%fallback argument \"%s\" should be a token", x);
         psp->errorcnt++;
       }else{
         struct symbol *sp = Symbol_new(x);
@@ -2543,11 +2543,11 @@
       }
       break;
     case WAITING_FOR_WILDCARD_ID:
       if( x[0]=='.' ){
         psp->state = WAITING_FOR_DECL_OR_RULE;
-      }else if( !isupper(x[0]) ){
+      }else if( !isupper((unsigned char)x[0]) ){
         ErrorMsg(psp->filename, psp->tokenlineno,
           "%%wildcard argument \"%s\" should be a token", x);
         psp->errorcnt++;
       }else{
         struct symbol *sp = Symbol_new(x);
@@ -2559,11 +2559,11 @@
           psp->errorcnt++;
         }
       }
       break;
     case WAITING_FOR_CLASS_ID:
-      if( !islower(x[0]) ){
+      if( !islower((unsigned char)x[0]) ){
         ErrorMsg(psp->filename, psp->tokenlineno,
           "%%token_class must be followed by an identifier: ", x);
         psp->errorcnt++;
         psp->state = RESYNC_AFTER_DECL_ERROR;
      }else if( Symbol_find(x) ){
@@ -2578,16 +2578,16 @@
       }
       break;
     case WAITING_FOR_CLASS_TOKEN:
       if( x[0]=='.' ){
         psp->state = WAITING_FOR_DECL_OR_RULE;
-      }else if( isupper(x[0]) || ((x[0]=='|' || x[0]=='/') && isupper(x[1])) ){
+      }else if( isupper((unsigned char)x[0]) || ((x[0]=='|' || x[0]=='/') && 
isupper((unsigned char)x[1])) ){
         struct symbol *msp = psp->tkclass;
         msp->nsubsym++;
         msp->subsym = (struct symbol **) realloc(msp->subsym,
           sizeof(struct symbol*)*msp->nsubsym);
-        if( !isupper(x[0]) ) x++;
+        if( !isupper((unsigned char)x[0]) ) x++;
         msp->subsym[msp->nsubsym-1] = Symbol_new(x);
       }else{
         ErrorMsg(psp->filename, psp->tokenlineno,
           "%%token_class argument \"%s\" should be a token", x);
         psp->errorcnt++;
@@ -2616,25 +2616,25 @@
   int lineno = 1;
   int start_lineno = 1;
   for(i=0; z[i]; i++){
     if( z[i]=='\n' ) lineno++;
     if( z[i]!='%' || (i>0 && z[i-1]!='\n') ) continue;
-    if( strncmp(&z[i],"%endif",6)==0 && isspace(z[i+6]) ){
+    if( strncmp(&z[i],"%endif",6)==0 && isspace((unsigned char)z[i + 6]) ){
       if( exclude ){
         exclude--;
         if( exclude==0 ){
           for(j=start; j<i; j++) if( z[j]!='\n' ) z[j] = ' ';
         }
       }
       for(j=i; z[j] && z[j]!='\n'; j++) z[j] = ' ';
-    }else if( (strncmp(&z[i],"%ifdef",6)==0 && isspace(z[i+6]))
-          || (strncmp(&z[i],"%ifndef",7)==0 && isspace(z[i+7])) ){
+    }else if( (strncmp(&z[i],"%ifdef",6)==0 && isspace((unsigned char)z[i + 
6]))
+             || (strncmp(&z[i],"%ifndef",7)==0 && isspace((unsigned char)z[i + 
7])) ){
       if( exclude ){
         exclude++;
       }else{
-        for(j=i+7; isspace(z[j]); j++){}
-        for(n=0; z[j+n] && !isspace(z[j+n]); n++){}
+        for(j=i+7; isspace((unsigned char)z[j]); j++){}
+        for(n=0; z[j+n] && !isspace((unsigned char)z[j + n]); n++){}
         exclude = 1;
         for(k=0; k<nDefine; k++){
           if( strncmp(azDefine[k],&z[j],n)==0 && lemonStrlen(azDefine[k])==n ){
             exclude = 0;
             break;
@@ -2786,11 +2786,11 @@
       while( (c= *cp)!=0 && (isalnum(c) || c=='_') ) cp++;
       nextcp = cp;
     }else if( c==':' && cp[1]==':' && cp[2]=='=' ){ /* The operator "::=" */
       cp += 3;
       nextcp = cp;
-    }else if( (c=='/' || c=='|') && isalpha(cp[1]) ){
+    }else if( (c=='/' || c=='|') && isalpha((unsigned char)cp[1]) ){
       cp += 2;
       while( (c = *cp)!=0 && (isalnum(c) || c=='_') ) cp++;
       nextcp = cp;
     }else{                          /* All other (one character) operators */
       cp++;
@@ -3239,11 +3239,11 @@
     (*lineno)++;
     iStart = 0;
     if( name ){
       for(i=0; line[i]; i++){
         if( line[i]=='P' && strncmp(&line[i],"Parse",5)==0
-          && (i==0 || !isalpha(line[i-1]))
+          && (i==0 || !isalpha((unsigned char)line[i - 1]))
         ){
           if( i>iStart ) fprintf(out,"%.*s",i-iStart,&line[iStart]);
           fprintf(out,"%s",name);
           i += 4;
           iStart = i+1;
@@ -3476,13 +3476,13 @@

   append_str(0,0,0,0);

   /* This const cast is wrong but harmless, if we're careful. */
   for(cp=(char *)rp->code; *cp; cp++){
-    if( isalpha(*cp) && (cp==rp->code || (!isalnum(cp[-1]) && cp[-1]!='_')) ){
+    if( isalpha((unsigned char)*cp) && (cp==rp->code || (!isalnum((unsigned 
char)cp[-1]) && cp[-1]!='_')) ){
       char saved;
-      for(xp= &cp[1]; isalnum(*xp) || *xp=='_'; xp++);
+      for(xp= &cp[1]; isalnum((unsigned char)*xp) || *xp=='_'; xp++);
       saved = *xp;
       *xp = 0;
       if( rp->lhsalias && strcmp(cp,rp->lhsalias)==0 ){
         append_str("yygotominor.yy%d",0,rp->lhs->dtnum,0);
         cp = xp;
@@ -3643,13 +3643,13 @@
       continue;
     }
     cp = sp->datatype;
     if( cp==0 ) cp = lemp->vartype;
     j = 0;
-    while( isspace(*cp) ) cp++;
+    while( isspace((unsigned char)*cp) ) cp++;
     while( *cp ) stddt[j++] = *cp++;
-    while( j>0 && isspace(stddt[j-1]) ) j--;
+    while( j>0 && isspace((unsigned char)stddt[j - 1]) ) j--;
     stddt[j] = 0;
     if( lemp->tokentype && strcmp(stddt, lemp->tokentype)==0 ){
       sp->dtnum = 0;
       continue;
     }
@@ -3855,12 +3855,12 @@
     fprintf(out,"#if INTERFACE\n"); lineno++;
   }
   name = lemp->name ? lemp->name : "Parse";
   if( lemp->arg && lemp->arg[0] ){
     i = lemonStrlen(lemp->arg);
-    while( i>=1 && isspace(lemp->arg[i-1]) ) i--;
-    while( i>=1 && (isalnum(lemp->arg[i-1]) || lemp->arg[i-1]=='_') ) i--;
+    while( i>=1 && isspace((unsigned char)lemp->arg[i - 1]) ) i--;
+    while( i>=1 && (isalnum((unsigned char)lemp->arg[i - 1]) || 
lemp->arg[i-1]=='_') ) i--;
     fprintf(out,"#define %sARG_SDECL %s;\n",name,lemp->arg);  lineno++;
     fprintf(out,"#define %sARG_PDECL ,%s\n",name,lemp->arg);  lineno++;
     fprintf(out,"#define %sARG_FETCH %s = yypParser->%s\n",
                  name,lemp->arg,&lemp->arg[i]);  lineno++;
     fprintf(out,"#define %sARG_STORE yypParser->%s = %s\n",
@@ -4664,11 +4664,11 @@
   sp = Symbol_find(x);
   if( sp==0 ){
     sp = (struct symbol *)calloc(1, sizeof(struct symbol) );
     MemoryCheck(sp);
     sp->name = Strsafe(x);
-    sp->type = isupper(*x) ? TERMINAL : NONTERMINAL;
+    sp->type = isupper((unsigned char)*x) ? TERMINAL : NONTERMINAL;
     sp->rule = 0;
     sp->fallback = 0;
     sp->prec = -1;
     sp->assoc = UNK;
     sp->firstset = 0;

Index: tool/showdb.c
==================================================================
--- tool/showdb.c
+++ tool/showdb.c
@@ -651,15 +651,15 @@
   while( zArgs[0] ){
     switch( zArgs[0] ){
       case 'c': showCellContent = 1;  break;
       case 'm': showMap = 1;          break;
       case 'd': {
-        if( !isdigit(zArgs[1]) ){
+        if( !isdigit((unsigned char)zArgs[1]) ){
           cellToDecode = -1;
         }else{
           cellToDecode = 0;
-          while( isdigit(zArgs[1]) ){
+          while( isdigit((unsigned char)zArgs[1]) ){
             zArgs++;
             cellToDecode = cellToDecode*10 + zArgs[0] - '0';
           }
         }
         break;
@@ -1121,11 +1121,11 @@
       }
       if( strcmp(azArg[i], "help")==0 ){
         usage(zPrg);
         continue;
       }
-      if( !isdigit(azArg[i][0]) ){
+      if( !isdigit((unsigned char)azArg[i][0]) ){
         fprintf(stderr, "%s: unknown option: [%s]\n", zPrg, azArg[i]);
         continue;
       }
       iStart = strtol(azArg[i], &zLeft, 0);
       if( zLeft && strcmp(zLeft,"..end")==0 ){

Index: tool/showstat4.c
==================================================================
--- tool/showstat4.c
+++ tool/showstat4.c
@@ -129,11 +129,11 @@
         printf("'");
       }else{
         printf("%s\"", zSep);
         for(j=0; j<sz; j++){
           char c = (char)aSample[y+j];
-          if( isprint(c) ){
+          if( isprint((unsigned char)c) ){
             if( c=='"' || c=='\\' ) putchar('\\');
             putchar(c);
           }else if( c=='\n' ){
             printf("\\n");
           }else if( c=='\t' ){

Index: tool/showwal.c
==================================================================
--- tool/showwal.c
+++ tool/showwal.c
@@ -548,11 +548,11 @@
       char *zLeft;
       if( strcmp(argv[i], "header")==0 ){
         print_wal_header(0);
         continue;
       }
-      if( !isdigit(argv[i][0]) ){
+      if( !isdigit((unsigned char)argv[i][0]) ){
         fprintf(stderr, "%s: unknown option: [%s]\n", argv[0], argv[i]);
         continue;
       }
       iStart = strtol(argv[i], &zLeft, 0);
       if( zLeft && strcmp(zLeft,"..end")==0 ){

Index: tool/speedtest16.c
==================================================================
--- tool/speedtest16.c
+++ tool/speedtest16.c
@@ -138,11 +138,11 @@
       zSql[j+1] = 0;
       isComplete = sqlite3_complete(&zSql[i]);
       zSql[j+1] = c;
       if( isComplete ){
         zSql[j] = 0;
-        while( i<j && isspace(zSql[i]) ){ i++; }
+        while( i<j && isspace((unsigned char)zSql[i]) ){ i++; }
         if( i<j ){
           nStmt++;
           nByte += j-i;
           prepareAndRun(db, &zSql[i]);
         }

Index: tool/speedtest8inst1.c
==================================================================
--- tool/speedtest8inst1.c
+++ tool/speedtest8inst1.c
@@ -195,11 +195,11 @@
       zSql[j+1] = 0;
       isComplete = sqlite3_complete(&zSql[i]);
       zSql[j+1] = c;
       if( isComplete ){
         zSql[j] = 0;
-        while( i<j && isspace(zSql[i]) ){ i++; }
+        while( i<j && isspace((unsigned char)zSql[i]) ){ i++; }
         if( i<j ){
           prepareAndRun(pInstVfs, db, &zSql[i]);
         }
         zSql[j] = ';';
         i = j+1;

Reply via email to