diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2022-05-23 12:38:42 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2022-05-23 12:40:26 -0700 |
commit | e7f8e8eb1fd41b308ee10741bbd8068acc1847c2 (patch) | |
tree | fd77cf49d10f23893b95c31bc8f9dc4b0bfe2cc3 | |
parent | 42db5cc8f58620b4c9c58a91c7683279c50503f9 (diff) | |
download | grep-e7f8e8eb1fd41b308ee10741bbd8068acc1847c2.tar.gz |
grep: warn about stray backslashes
This papers over a problem reported by Benno Schulenberg and
Tomasz Dziendzielski <https://bugs.gnu.org/39678> involving
regular expressions like \a that have unspecified behavior.
* src/dfasearch.c (dfawarn): Just output a warning.
Don’t exit, as DFA_CONFUSING_BRACKETS_ERROR now
does that for us, and we need the ability to warn
without exiting to diagnose \a etc.
(GEAcompile): Use new dfa options DFA_CONFUSING_BRACKETS_ERROR and
DFA_STRAY_BACKSLASH_WARN.
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | src/dfasearch.c | 7 |
2 files changed, 10 insertions, 3 deletions
@@ -11,6 +11,12 @@ GNU grep NEWS -*- outline -*- release 2.5.3 (2007), now warn that they are obsolescent and should be replaced by grep -E and grep -F. + Regular expressions with stray backslashes now cause warnings, as + their unspecified behavior can lead to unexpected results. + For example, '\a' and 'a' are not always equivalent + <https://bugs.gnu.org/39768>. The warnings are intended as a + transition aid; they are likely to be errors in future releases. + Regular expressions like [:space:] are now errors even if POSIXLY_CORRECT is set, since POSIX now allows the GNU behavior. diff --git a/src/dfasearch.c b/src/dfasearch.c index 8f48296a..7547a8a3 100644 --- a/src/dfasearch.c +++ b/src/dfasearch.c @@ -53,10 +53,10 @@ dfaerror (char const *mesg) die (EXIT_TROUBLE, 0, "%s", mesg); } -_Noreturn void +void dfawarn (char const *mesg) { - dfaerror (mesg); + error (0, 0, _("warning: %s"), mesg); } /* If the DFA turns out to have some set of fixed strings one of @@ -196,7 +196,8 @@ GEAcompile (char *pattern, idx_t size, reg_syntax_t syntax_bits, if (match_icase) syntax_bits |= RE_ICASE; - int dfaopts = eolbyte ? 0 : DFA_EOL_NUL; + int dfaopts = (DFA_CONFUSING_BRACKETS_ERROR | DFA_STRAY_BACKSLASH_WARN + | (eolbyte ? 0 : DFA_EOL_NUL)); dfasyntax (dc->dfa, &localeinfo, syntax_bits, dfaopts); bool bs_safe = !localeinfo.multibyte | localeinfo.using_utf8; |