diff options
author | Andy Fiddaman <omnios@citrus-it.co.uk> | 2021-12-01 11:54:52 +0000 |
---|---|---|
committer | Andy Fiddaman <omnios@citrus-it.co.uk> | 2021-12-06 16:51:35 +0000 |
commit | be548e87bcb4979e0b8a7bce5620a9916b888fdc (patch) | |
tree | 8b3485ef82e1b9a9031c8a38c6bbf0e65b05e791 /usr/src | |
parent | ea3cb02b50effb9ec1ecee7e7178c14143cd2485 (diff) | |
download | illumos-gate-be548e87bcb4979e0b8a7bce5620a9916b888fdc.tar.gz |
14277 Improve shell lint checks
Reviewed by: Robert Mustacchi <rm+illumos@fingolfin.org>
Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/contrib/ast/src/cmd/ksh93/data/lexstates.c | 5 | ||||
-rw-r--r-- | usr/src/contrib/ast/src/cmd/ksh93/sh/lex.c | 39 | ||||
-rw-r--r-- | usr/src/contrib/ast/src/cmd/ksh93/sh/parse.c | 21 |
3 files changed, 35 insertions, 30 deletions
diff --git a/usr/src/contrib/ast/src/cmd/ksh93/data/lexstates.c b/usr/src/contrib/ast/src/cmd/ksh93/data/lexstates.c index 01e56f5471..d3ac0d5b50 100644 --- a/usr/src/contrib/ast/src/cmd/ksh93/data/lexstates.c +++ b/usr/src/contrib/ast/src/cmd/ksh93/data/lexstates.c @@ -393,14 +393,13 @@ const char e_lexsyntax2[] = "syntax error: `%s' %s"; const char e_lexsyntax3[] = "syntax error at line %d: duplicate label %s"; const char e_lexsyntax4[] = "syntax error at line %d: invalid reference list"; const char e_lexsyntax5[] = "syntax error at line %d: `<<%s' here-document not contained within command substitution"; -const char e_lexwarnvar[] = "line %d: in '((%s))', using '$' is unnecessary, incurs a penalty and can introduce rounding errors."; +const char e_lexwarnvar[] = "line %d: in '((%s))', using '$' as in '$%.*s' is slower and can introduce rounding errors"; const char e_lexlabignore[] = "line %d: label %s ignored"; const char e_lexlabunknown[] = "line %d: %s unknown label"; const char e_lexobsolete1[] = "line %d: `...` obsolete, use $(...)"; const char e_lexobsolete2[] = "line %d: -a obsolete, use -e"; const char e_lexobsolete3[] = "line %d: '=' obsolete, use '=='"; -const char e_lexobsolete4[] = "line %d: %s within [[...]] obsolete, use ((...))"; -const char e_lexobsolete4b[] = "line %d: [[... %s ...]] obsolete, use ((... %s ...))"; +const char e_lexobsolete4[] = "line %d: [[... %s ...]] obsolete, use ((... %s ...))"; const char e_lexobsolete5[] = "line %d: set %s obsolete"; const char e_lexobsolete6[] = "line %d: `{' instead of `in' is obsolete"; const char e_lexnonstandard[] = "line %d: `&>file' is nonstandard -- interpreted as `>file 2>&1' for profile input only"; diff --git a/usr/src/contrib/ast/src/cmd/ksh93/sh/lex.c b/usr/src/contrib/ast/src/cmd/ksh93/sh/lex.c index b517246167..5c79af45a3 100644 --- a/usr/src/contrib/ast/src/cmd/ksh93/sh/lex.c +++ b/usr/src/contrib/ast/src/cmd/ksh93/sh/lex.c @@ -1462,36 +1462,35 @@ breakloop: default: if(lp->lex.testop2) { -#ifdef __ASTUpstream__ - if(lp->lexd.warn && (c&TEST_ARITH)) - errormsg(SH_DICT,ERROR_warn(0),e_lexobsolete4,shp->inlineno,state); -#else if(lp->lexd.warn && (c&TEST_ARITH)) { - char *alt = NULL; + char *alt; - if (strcmp(state, "-eq") == 0) + switch (c) { + case TEST_EQ: alt = "=="; - else if (strcmp(state, "-ne") == 0) + break; + case TEST_NE: alt = "!="; - else if (strcmp(state, "-lt") == 0) + break; + case TEST_LT: alt = "<"; - else if (strcmp(state, "-gt") == 0) + break; + case TEST_GT: alt = ">"; - else if (strcmp(state, "-le") == 0) + break; + case TEST_LE: alt = "<="; - else if (strcmp(state, "-ge") == 0) + break; + case TEST_GE: alt = ">="; - if (alt != NULL) { - errormsg(SH_DICT, ERROR_warn(0), - e_lexobsolete4b, - shp->inlineno, state, alt); - } else { - errormsg(SH_DICT, ERROR_warn(0), - e_lexobsolete4, - shp->inlineno, state); + break; + default: + alt = "??"; } + errormsg(SH_DICT, ERROR_warn(0), + e_lexobsolete4, + shp->inlineno, state, alt); } -#endif if(c&TEST_PATTERN) lp->lex.incase = 1; else if(c==TEST_REP) diff --git a/usr/src/contrib/ast/src/cmd/ksh93/sh/parse.c b/usr/src/contrib/ast/src/cmd/ksh93/sh/parse.c index d9100840f0..b6e09ccc2f 100644 --- a/usr/src/contrib/ast/src/cmd/ksh93/sh/parse.c +++ b/usr/src/contrib/ast/src/cmd/ksh93/sh/parse.c @@ -251,7 +251,7 @@ static Shnode_t *makeparent(Lex_t *lp, int flag, Shnode_t *child) return(par); } -static int paramsub(const char *str) +static const char *paramsub(const char *str) { register int c,sub=0,lit=0; while(c= *str++) @@ -259,16 +259,16 @@ static int paramsub(const char *str) if(c=='$' && !lit) { if(*str=='(') - return(0); + return(NULL); if(sub) continue; if(*str=='{') str++; if(!isdigit(*str) && strchr("?#@*!$ ",*str)==0) - return(1); + return(str); } else if(c=='`') - return(0); + return(NULL); else if(c=='[' && !lit) sub++; else if(c==']' && !lit) @@ -276,7 +276,7 @@ static int paramsub(const char *str) else if(c=='\'') lit = !lit; } - return(0); + return(NULL); } static Shnode_t *getanode(Lex_t *lp, struct argnod *ap) @@ -289,8 +289,15 @@ static Shnode_t *getanode(Lex_t *lp, struct argnod *ap) t->ar.arcomp = sh_arithcomp(lp->sh,ap->argval); else { - if(sh_isoption(SH_NOEXEC) && (ap->argflag&ARG_MAC) && paramsub(ap->argval)) - errormsg(SH_DICT,ERROR_warn(0),e_lexwarnvar,lp->sh->inlineno, ap->argval); + const char *p, *q; + + if (sh_isoption(SH_NOEXEC) && (ap->argflag&ARG_MAC) && + (p = paramsub(ap->argval)) != NULL) { + for (q = p; !isspace(*q) && *q != '\0'; q++) + ; + errormsg(SH_DICT, ERROR_warn(0), e_lexwarnvar, + lp->sh->inlineno, ap->argval, q - p, p); + } t->ar.arcomp = 0; } return(t); |