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 ran my Coccinelle script on
the repo.
The below diff was generated automatically, so formatting may be changed
and mistakes are possible (though unlikely).
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
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;