Module Name: src Committed By: rillig Date: Sun May 12 18:49:36 UTC 2024
Modified Files: src/usr.bin/xlint/common: lint.h src/usr.bin/xlint/lint1: cksnprintb.c decl.c emit1.c err.c lex.c src/usr.bin/xlint/lint2: chk.c emit2.c read.c src/usr.bin/xlint/xlint: xlint.c Log Message: lint: add wrapper for <ctype.h> functions, for strict bool mode When using the Clang preprocessor (with MKLLVM=yes), the preprocessor output does not indicate which tokens come from a system header and which tokens come from the user code. Lint's strict bool mode relies on this information to treat the character classification functions from <ctype.h> as if their return type were bool instead of int. These wrapper functions are only used when their argument is indeed a 'char', but not when the argument might be 'EOF or representable as an unsigned char', such as when reading a byte from the input. To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.50 src/usr.bin/xlint/common/lint.h cvs rdiff -u -r1.14 -r1.15 src/usr.bin/xlint/lint1/cksnprintb.c cvs rdiff -u -r1.402 -r1.403 src/usr.bin/xlint/lint1/decl.c cvs rdiff -u -r1.94 -r1.95 src/usr.bin/xlint/lint1/emit1.c cvs rdiff -u -r1.243 -r1.244 src/usr.bin/xlint/lint1/err.c cvs rdiff -u -r1.227 -r1.228 src/usr.bin/xlint/lint1/lex.c cvs rdiff -u -r1.66 -r1.67 src/usr.bin/xlint/lint2/chk.c cvs rdiff -u -r1.38 -r1.39 src/usr.bin/xlint/lint2/emit2.c cvs rdiff -u -r1.91 -r1.92 src/usr.bin/xlint/lint2/read.c cvs rdiff -u -r1.124 -r1.125 src/usr.bin/xlint/xlint/xlint.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/xlint/common/lint.h diff -u src/usr.bin/xlint/common/lint.h:1.49 src/usr.bin/xlint/common/lint.h:1.50 --- src/usr.bin/xlint/common/lint.h:1.49 Sat Mar 2 09:32:18 2024 +++ src/usr.bin/xlint/common/lint.h Sun May 12 18:49:35 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: lint.h,v 1.49 2024/03/02 09:32:18 rillig Exp $ */ +/* $NetBSD: lint.h,v 1.50 2024/05/12 18:49:35 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -160,4 +160,46 @@ typedef struct lint2_type type_t; #endif #endif +static inline bool +ch_isalnum(char ch) +{ + return isalnum((unsigned char)ch) != 0; +} + +static inline bool +ch_isalpha(char ch) +{ + return isalpha((unsigned char)ch) != 0; +} + +static inline bool +ch_isdigit(char ch) +{ + return isdigit((unsigned char)ch) != 0; +} + +static inline bool +ch_islower(char ch) +{ + return islower((unsigned char)ch) != 0; +} + +static inline bool +ch_isprint(char ch) +{ + return isprint((unsigned char)ch) != 0; +} + +static inline bool +ch_isspace(char ch) +{ + return isspace((unsigned char)ch) != 0; +} + +static inline bool +ch_isupper(char ch) +{ + return isupper((unsigned char)ch) != 0; +} + #include "externs.h" Index: src/usr.bin/xlint/lint1/cksnprintb.c diff -u src/usr.bin/xlint/lint1/cksnprintb.c:1.14 src/usr.bin/xlint/lint1/cksnprintb.c:1.15 --- src/usr.bin/xlint/lint1/cksnprintb.c:1.14 Fri Apr 12 05:44:38 2024 +++ src/usr.bin/xlint/lint1/cksnprintb.c Sun May 12 18:49:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: cksnprintb.c,v 1.14 2024/04/12 05:44:38 rillig Exp $ */ +/* $NetBSD: cksnprintb.c,v 1.15 2024/05/12 18:49:36 rillig Exp $ */ /*- * Copyright (c) 2024 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: cksnprintb.c,v 1.14 2024/04/12 05:44:38 rillig Exp $"); +__RCSID("$NetBSD: cksnprintb.c,v 1.15 2024/05/12 18:49:36 rillig Exp $"); #endif #include <stdbool.h> @@ -86,9 +86,9 @@ check_hex_escape(const buffer *buf, quot bool upper = false; bool lower = false; for (size_t i = it.start + 2; i < it.end; i++) { - if (isupper((unsigned char)buf->data[i])) + if (ch_isupper(buf->data[i])) upper = true; - if (islower((unsigned char)buf->data[i])) + if (ch_islower(buf->data[i])) lower = true; } if (upper && lower) Index: src/usr.bin/xlint/lint1/decl.c diff -u src/usr.bin/xlint/lint1/decl.c:1.402 src/usr.bin/xlint/lint1/decl.c:1.403 --- src/usr.bin/xlint/lint1/decl.c:1.402 Sat May 4 06:52:16 2024 +++ src/usr.bin/xlint/lint1/decl.c Sun May 12 18:49:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: decl.c,v 1.402 2024/05/04 06:52:16 rillig Exp $ */ +/* $NetBSD: decl.c,v 1.403 2024/05/12 18:49:36 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: decl.c,v 1.402 2024/05/04 06:52:16 rillig Exp $"); +__RCSID("$NetBSD: decl.c,v 1.403 2024/05/12 18:49:36 rillig Exp $"); #endif #include <sys/param.h> @@ -1808,7 +1808,7 @@ check_extern_declaration(const sym_t *sy dcs->d_redeclared_symbol == NULL && ends_with(curr_pos.p_file, ".c") && allow_c90 && - !isdigit((unsigned char)sym->s_name[0]) && /* see mktempsym */ + !ch_isdigit(sym->s_name[0]) && /* see mktempsym */ strcmp(sym->s_name, "main") != 0) { /* missing%s header declaration for '%s' */ warning(351, sym->s_type->t_tspec == FUNC ? "" : " 'extern'", @@ -2906,7 +2906,7 @@ check_variable_usage(bool novar, const s lint_assert(block_level != 0); /* example at file scope: int c = ({ return 3; }); */ - if (sym->s_block_level == 0 && isdigit((unsigned char)sym->s_name[0])) + if (sym->s_block_level == 0 && ch_isdigit(sym->s_name[0])) return; /* errors in expressions easily cause lots of these warnings */ Index: src/usr.bin/xlint/lint1/emit1.c diff -u src/usr.bin/xlint/lint1/emit1.c:1.94 src/usr.bin/xlint/lint1/emit1.c:1.95 --- src/usr.bin/xlint/lint1/emit1.c:1.94 Wed Mar 27 20:09:43 2024 +++ src/usr.bin/xlint/lint1/emit1.c Sun May 12 18:49:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: emit1.c,v 1.94 2024/03/27 20:09:43 rillig Exp $ */ +/* $NetBSD: emit1.c,v 1.95 2024/05/12 18:49:36 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: emit1.c,v 1.94 2024/03/27 20:09:43 rillig Exp $"); +__RCSID("$NetBSD: emit1.c,v 1.95 2024/05/12 18:49:36 rillig Exp $"); #endif #include <stdlib.h> @@ -187,7 +187,7 @@ outsym(const sym_t *sym, scl_t sc, def_t */ if (sc != EXTERN && !(sc == STATIC && sym->s_type->t_tspec == FUNC)) return; - if (isdigit((unsigned char)sym->s_name[0])) /* see mktempsym */ + if (ch_isdigit(sym->s_name[0])) /* see mktempsym */ return; outint(csrc_pos.p_line); @@ -393,7 +393,7 @@ static void outqchar(char c) { - if (isprint((unsigned char)c) && c != '\\' && c != '"' && c != '\'') { + if (ch_isprint(c) && c != '\\' && c != '"' && c != '\'') { outchar(c); return; } @@ -467,7 +467,7 @@ outfstrg(const char *cp) } /* numeric field width */ - while (isdigit((unsigned char)c)) { + while (ch_isdigit(c)) { outchar(c); c = *cp++; } @@ -480,7 +480,7 @@ outfstrg(const char *cp) outchar(c); c = *cp++; } else { - while (isdigit((unsigned char)c)) { + while (ch_isdigit(c)) { outchar(c); c = *cp++; } @@ -534,7 +534,7 @@ outfstrg(const char *cp) void outusg(const sym_t *sym) { - if (isdigit((unsigned char)sym->s_name[0])) /* see mktempsym */ + if (ch_isdigit(sym->s_name[0])) /* see mktempsym */ return; outint(csrc_pos.p_line); Index: src/usr.bin/xlint/lint1/err.c diff -u src/usr.bin/xlint/lint1/err.c:1.243 src/usr.bin/xlint/lint1/err.c:1.244 --- src/usr.bin/xlint/lint1/err.c:1.243 Sat May 11 15:53:38 2024 +++ src/usr.bin/xlint/lint1/err.c Sun May 12 18:49:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: err.c,v 1.243 2024/05/11 15:53:38 rillig Exp $ */ +/* $NetBSD: err.c,v 1.244 2024/05/12 18:49:36 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: err.c,v 1.243 2024/05/11 15:53:38 rillig Exp $"); +__RCSID("$NetBSD: err.c,v 1.244 2024/05/12 18:49:36 rillig Exp $"); #endif #include <limits.h> @@ -450,7 +450,7 @@ suppress_messages(const char *p) { char *end; - for (; isdigit((unsigned char)*p); p = end + 1) { + for (; ch_isdigit(*p); p = end + 1) { unsigned long id = strtoul(p, &end, 10); if ((*end != '\0' && *end != ',') || id >= sizeof(msgs) / sizeof(msgs[0]) || @@ -771,7 +771,7 @@ enable_queries(const char *p) { char *end; - for (; isdigit((unsigned char)*p); p = end + 1) { + for (; ch_isdigit(*p); p = end + 1) { unsigned long id = strtoul(p, &end, 10); if ((*end != '\0' && *end != ',') || id >= sizeof(queries) / sizeof(queries[0]) || Index: src/usr.bin/xlint/lint1/lex.c diff -u src/usr.bin/xlint/lint1/lex.c:1.227 src/usr.bin/xlint/lint1/lex.c:1.228 --- src/usr.bin/xlint/lint1/lex.c:1.227 Sun May 12 09:07:41 2024 +++ src/usr.bin/xlint/lint1/lex.c Sun May 12 18:49:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: lex.c,v 1.227 2024/05/12 09:07:41 rillig Exp $ */ +/* $NetBSD: lex.c,v 1.228 2024/05/12 18:49:36 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: lex.c,v 1.227 2024/05/12 09:07:41 rillig Exp $"); +__RCSID("$NetBSD: lex.c,v 1.228 2024/05/12 18:49:36 rillig Exp $"); #endif #include <ctype.h> @@ -896,7 +896,7 @@ check_quoted(const buffer *buf, bool com warning(264); else { unsigned char ch = buf->data[it.end - 1]; - if (isprint(ch)) + if (ch_isprint(ch)) /* dubious escape \%c */ warning(79, ch); else @@ -1029,11 +1029,11 @@ parse_line_directive_flags(const char *p *is_system = false; while (*p != '\0') { - while (isspace((unsigned char)*p)) + while (ch_isspace(*p)) p++; const char *word = p; - while (*p != '\0' && !isspace((unsigned char)*p)) + while (*p != '\0' && !ch_isspace(*p)) p++; size_t len = (size_t)(p - word); @@ -1077,9 +1077,9 @@ lex_directive(const char *text) while (*p == ' ' || *p == '\t') p++; - if (!isdigit((unsigned char)*p)) { + if (!ch_isdigit(*p)) { if (strncmp(p, "pragma", 6) == 0 - && isspace((unsigned char)p[6])) + && ch_isspace(p[6])) return; goto error; } @@ -1164,19 +1164,19 @@ lex_comment(void) bool seen_end_of_comment = false; - while (c = read_byte(), isspace(c)) + while (c = read_byte(), isspace(c) != 0) continue; /* Read the potential keyword to keywd */ size_t l = 0; while (c != EOF && l < sizeof(keywd) - 1 && - (isalpha(c) || isspace(c))) { - if (islower(c) && l > 0 && isupper((unsigned char)keywd[0])) + (isalpha(c) != 0 || isspace(c) != 0)) { + if (islower(c) != 0 && l > 0 && ch_isupper(keywd[0])) break; keywd[l++] = (char)c; c = read_byte(); } - while (l > 0 && isspace((unsigned char)keywd[l - 1])) + while (l > 0 && ch_isspace(keywd[l - 1])) l--; keywd[l] = '\0'; @@ -1188,14 +1188,14 @@ lex_comment(void) goto skip_rest; found_keyword: - while (isspace(c)) + while (isspace(c) != 0) c = read_byte(); /* read the argument, if the keyword accepts one and there is one */ char arg[32]; l = 0; if (keywtab[i].arg) { - while (isdigit(c) && l < sizeof(arg) - 1) { + while (isdigit(c) != 0 && l < sizeof(arg) - 1) { arg[l++] = (char)c; c = read_byte(); } @@ -1203,7 +1203,7 @@ found_keyword: arg[l] = '\0'; int a = l != 0 ? atoi(arg) : -1; - while (isspace(c)) + while (isspace(c) != 0) c = read_byte(); seen_end_of_comment = c == '*' && (c = read_byte()) == '/'; Index: src/usr.bin/xlint/lint2/chk.c diff -u src/usr.bin/xlint/lint2/chk.c:1.66 src/usr.bin/xlint/lint2/chk.c:1.67 --- src/usr.bin/xlint/lint2/chk.c:1.66 Sat Mar 2 09:32:18 2024 +++ src/usr.bin/xlint/lint2/chk.c Sun May 12 18:49:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: chk.c,v 1.66 2024/03/02 09:32:18 rillig Exp $ */ +/* $NetBSD: chk.c,v 1.67 2024/05/12 18:49:36 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: chk.c,v 1.66 2024/03/02 09:32:18 rillig Exp $"); +__RCSID("$NetBSD: chk.c,v 1.67 2024/05/12 18:49:36 rillig Exp $"); #endif #include <ctype.h> @@ -642,9 +642,9 @@ printflike(const hte_t *hte, fcall_t *ca } /* field width */ - if (isdigit((unsigned char)fc)) { + if (ch_isdigit(fc)) { fwidth = true; - do { fc = *fp++; } while (isdigit((unsigned char)fc)); + do { fc = *fp++; } while (ch_isdigit(fc)); } else if (fc == '*') { fwidth = true; fc = *fp++; @@ -661,10 +661,10 @@ printflike(const hte_t *hte, fcall_t *ca if (fc == '.') { fc = *fp++; prec = true; - if (isdigit((unsigned char)fc)) { + if (ch_isdigit(fc)) { do { fc = *fp++; - } while (isdigit((unsigned char)fc)); + } while (ch_isdigit(fc)); } else if (fc == '*') { fc = *fp++; if ((tp = *ap++) == NULL) { @@ -846,9 +846,9 @@ scanflike(const hte_t *hte, fcall_t *cal fc = *fp++; } - if (isdigit((unsigned char)fc)) { + if (ch_isdigit(fc)) { fwidth = true; - do { fc = *fp++; } while (isdigit((unsigned char)fc)); + do { fc = *fp++; } while (ch_isdigit(fc)); } if (fc == 'h') { Index: src/usr.bin/xlint/lint2/emit2.c diff -u src/usr.bin/xlint/lint2/emit2.c:1.38 src/usr.bin/xlint/lint2/emit2.c:1.39 --- src/usr.bin/xlint/lint2/emit2.c:1.38 Sat Mar 2 09:32:19 2024 +++ src/usr.bin/xlint/lint2/emit2.c Sun May 12 18:49:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: emit2.c,v 1.38 2024/03/02 09:32:19 rillig Exp $ */ +/* $NetBSD: emit2.c,v 1.39 2024/05/12 18:49:36 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -34,7 +34,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: emit2.c,v 1.38 2024/03/02 09:32:19 rillig Exp $"); +__RCSID("$NetBSD: emit2.c,v 1.39 2024/05/12 18:49:36 rillig Exp $"); #endif #include "lint2.h" @@ -60,7 +60,7 @@ outtype(type_t *tp) tspec_t ts = tp->t_tspec; if (ts == INT && tp->t_is_enum) ts = ENUM; - if (!isupper((unsigned char)tt[ts])) + if (!ch_isupper(tt[ts])) errx(1, "internal error: outtype(%d)", ts); if (tp->t_const) outchar('c'); Index: src/usr.bin/xlint/lint2/read.c diff -u src/usr.bin/xlint/lint2/read.c:1.91 src/usr.bin/xlint/lint2/read.c:1.92 --- src/usr.bin/xlint/lint2/read.c:1.91 Sat Mar 2 09:32:19 2024 +++ src/usr.bin/xlint/lint2/read.c Sun May 12 18:49:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: read.c,v 1.91 2024/03/02 09:32:19 rillig Exp $ */ +/* $NetBSD: read.c,v 1.92 2024/05/12 18:49:36 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: read.c,v 1.91 2024/03/02 09:32:19 rillig Exp $"); +__RCSID("$NetBSD: read.c,v 1.92 2024/05/12 18:49:36 rillig Exp $"); #endif #include <ctype.h> @@ -692,7 +692,7 @@ inptype(const char *cp, const char **epp break; case FUNC: c = *cp; - if (isdigit((unsigned char)c)) { + if (ch_isdigit(c)) { if (!osdef) tp->t_proto = true; narg = parse_int(&cp); @@ -881,7 +881,7 @@ gettlen(const char *cp, const char **epp break; case FUNC: c = *cp; - if (isdigit((unsigned char)c)) { + if (ch_isdigit(c)) { narg = parse_int(&cp); for (i = 0; i < narg; i++) { if (i == narg - 1 && *cp == 'E') @@ -1091,7 +1091,7 @@ inpname(const char *cp, const char **epp buf = xrealloc(buf, blen = len + 1); for (i = 0; i < len; i++) { c = *cp++; - if (!isalnum((unsigned char)c) && c != '_') + if (!ch_isalnum(c) && c != '_') inperr("not alnum or _: %c", c); buf[i] = c; } Index: src/usr.bin/xlint/xlint/xlint.c diff -u src/usr.bin/xlint/xlint/xlint.c:1.124 src/usr.bin/xlint/xlint/xlint.c:1.125 --- src/usr.bin/xlint/xlint/xlint.c:1.124 Sun May 12 18:00:59 2024 +++ src/usr.bin/xlint/xlint/xlint.c Sun May 12 18:49:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: xlint.c,v 1.124 2024/05/12 18:00:59 rillig Exp $ */ +/* $NetBSD: xlint.c,v 1.125 2024/05/12 18:49:36 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: xlint.c,v 1.124 2024/05/12 18:00:59 rillig Exp $"); +__RCSID("$NetBSD: xlint.c,v 1.125 2024/05/12 18:49:36 rillig Exp $"); #endif #include <sys/param.h> @@ -257,7 +257,7 @@ static bool is_safe_shell(char ch) { - return isalnum((unsigned char)ch) + return ch_isalnum(ch) || ch == '%' || ch == '+' || ch == ',' || ch == '-' || ch == '.' || ch == '/' || ch == ':' || ch == '=' || ch == '@' || ch == '_'; }