git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 09/11] diffcore-pickaxe: "share" regex error handling code

From
Jeff King <peff@peff.net>
Date
Jun 23, 2016, 19:16 UTC
Message-ID
<20160623191614.GA1841@sigill.intra.peff.net>
In-Reply-To
<20160623162907.23295-10-pclouds@gmail.com>
On Thu, Jun 23, 2016 at 06:29:05PM +0200, Nguyễn Thái Ngọc Duy wrote:
Show 37 quoted lines
> diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
> index 7715c13..69c6567 100644
> --- a/diffcore-pickaxe.c
> +++ b/diffcore-pickaxe.c
> @@ -204,20 +204,13 @@ void diffcore_pickaxe(struct diff_options *o)
>  	int opts = o->pickaxe_opts;
>  	regex_t regex, *regexp = NULL;
>  	kwset_t kws = NULL;
> +	int err = 0;
>  
>  	if (opts & (DIFF_PICKAXE_REGEX | DIFF_PICKAXE_KIND_G)) {
> -		int err;
>  		int cflags = REG_EXTENDED | REG_NEWLINE;
>  		if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE))
>  			cflags |= REG_ICASE;
>  		err = regcomp(&regex, needle, cflags);
> -		if (err) {
> -			/* The POSIX.2 people are surely sick */
> -			char errbuf[1024];
> -			regerror(err, &regex, errbuf, 1024);
> -			regfree(&regex);
> -			die("invalid regex: %s", errbuf);
> -		}
>  		regexp = &regex;
>  	} else {
>  		kws = kwsalloc(DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE)
> @@ -225,6 +218,13 @@ void diffcore_pickaxe(struct diff_options *o)
>  		kwsincr(kws, needle, strlen(needle));
>  		kwsprep(kws);
>  	}
> +	if (err) {
> +		/* The POSIX.2 people are surely sick */
> +		char errbuf[1024];
> +		regerror(err, &regex, errbuf, 1024);
> +		regfree(&regex);
> +		die("invalid regex: %s", errbuf);
> +	}

Hrm. I wondered what happens if we see an error in the kwset code block, which did not put anything useful in "regex" at all.

It's OK right now, because "err" is newly promoted to the top of the function, and so we know that kwset cannot call it. But it seems like an accident waiting to happen. Calling it "regex_err" or something might help.

But I also wonder if a function wouldn't be better. You could even roll it up with regcomp, like:

  static void regcomp_or_die(regex_t *regex, const char *pattern, int flags)
  {
	int err = regcomp(regex, pattern, flags);
	if (err) {
		char buf[1024];
		regerror(err, &regex, buf, sizeof(buf));
		regfree(&regex);
		die("invalid regex: %s", buf);
	}
  }

I think you could also skip the regfree(), since we are about to die. I also think the error message would probably be better if it mentioned the text of "pattern" itself (since it might be coming from config, or you might have provided several patterns, or you might have thought something was supposed to be a non-regex).

-Peff
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 6 of 39 in “nd/icase updates”
  1. 00/11 nd/icase updatesNguyễn Thái Ngọc Duy, Jun 23, 2016
  2. 02/11 test-regex: isolate the bug test codeNguyễn Thái Ngọc Duy, Jun 23, 2016
  3. 05/11 grep/icase: avoid kwsset when -F is specifiedNguyễn Thái Ngọc Duy, Jun 23, 2016
  4. Junio C HamanoJun 23, 2016
  5. 09/11 diffcore-pickaxe: "share" regex error handling codeNguyễn Thái Ngọc Duy, Jun 23, 2016
  6. Jeff KingJun 23, 2016
  7. 11/11 grep.c: reuse "icase" variableNguyễn Thái Ngọc Duy, Jun 23, 2016
  8. 03/11 test-regex: expose full regcomp() to the command lineNguyễn Thái Ngọc Duy, Jun 23, 2016
  9. 08/11 grep/pcre: support utf-8Nguyễn Thái Ngọc Duy, Jun 23, 2016
  10. 10/11 diffcore-pickaxe: support case insensitive match on non-asciiNguyễn Thái Ngọc Duy, Jun 23, 2016
  11. 07/11 gettext: add is_utf8_locale()Nguyễn Thái Ngọc Duy, Jun 23, 2016
  12. 01/11 grep: break down an "if" stmt in preparation for next changesNguyễn Thái Ngọc Duy, Jun 23, 2016
  13. 04/11 grep/icase: avoid kwsset on literal non-ascii stringsNguyễn Thái Ngọc Duy, Jun 23, 2016
  14. Junio C HamanoJun 23, 2016
  15. 06/11 grep/pcre: prepare locale-dependent tables for icase matchingNguyễn Thái Ngọc Duy, Jun 23, 2016
  16. Junio C HamanoJun 23, 2016
  17. 00/12 nd/icase updatesNguyễn Thái Ngọc Duy, Jun 25, 2016
  18. 03/12 test-regex: expose full regcomp() to the command lineNguyễn Thái Ngọc Duy, Jun 25, 2016
  19. 04/12 grep/icase: avoid kwsset on literal non-ascii stringsNguyễn Thái Ngọc Duy, Jun 25, 2016
  20. 07/12 grep/pcre: prepare locale-dependent tables for icase matchingNguyễn Thái Ngọc Duy, Jun 25, 2016
  21. 06/12 grep: rewrite an if/else condition to avoid duplicate expressionNguyễn Thái Ngọc Duy, Jun 25, 2016
  22. 10/12 diffcore-pickaxe: Add regcomp_or_die()Nguyễn Thái Ngọc Duy, Jun 25, 2016
  23. 09/12 grep/pcre: support utf-8Nguyễn Thái Ngọc Duy, Jun 25, 2016
  24. 05/12 grep/icase: avoid kwsset when -F is specifiedNguyễn Thái Ngọc Duy, Jun 25, 2016
  25. 12/12 grep.c: reuse "icase" variableNguyễn Thái Ngọc Duy, Jun 25, 2016
  26. 08/12 gettext: add is_utf8_locale()Nguyễn Thái Ngọc Duy, Jun 25, 2016
  27. 01/12 grep: break down an "if" stmt in preparation for next changesNguyễn Thái Ngọc Duy, Jun 25, 2016
  28. 11/12 diffcore-pickaxe: support case insensitive match on non-asciiNguyễn Thái Ngọc Duy, Jun 25, 2016
  29. 02/12 test-regex: isolate the bug test codeNguyễn Thái Ngọc Duy, Jun 25, 2016
  30. Junio C HamanoJun 27, 2016
  31. Junio C HamanoJun 27, 2016
  32. Duy NguyenJun 30, 2016
  33. Junio C HamanoJul 1, 2016
  34. Duy NguyenJul 1, 2016
  35. Junio C HamanoJul 1, 2016
  36. Junio C HamanoJul 1, 2016
  37. Junio C HamanoJul 1, 2016
  38. Junio C HamanoJul 1, 2016
  39. Junio C HamanoJul 1, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.