colis-anr / morbig

A static parser for POSIX Shell
Other
190 stars 8 forks source link

Bad arithmetic expansion not recognised #115

Open Niols opened 4 years ago

Niols commented 4 years ago

The following

$((a) || (b))

is parsed as

[
  "Word",
  "$((a) || (b))",
  [ [ "WordLiteral", "$((a) || (b))" ] ]
]

The standard says:

The syntax of the shell command language has an ambiguity for expansions beginning with "$((", which can introduce an arithmetic expansion or a command substitution that starts with a subshell. Arithmetic expansion has precedence; that is, the shell shall first determine whether it can parse the expansion as an arithmetic expansion and shall only parse the expansion as a command substitution if it determines that it cannot parse the expansion as an arithmetic expansion. The shell need not evaluate nested expansions when performing this determination. If it encounters the end of input without already having determined that it cannot parse the expansion as an arithmetic expansion, the shell shall treat the expansion as an incomplete arithmetic expansion and report a syntax error. A conforming application shall ensure that it separates the "$(" and '(' into two tokens (that is, separate them with white space) in a command substitution that starts with a subshell. For example, a command substitution containing a single subshell could be written as:

$( (command) )