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

Re: git grep: ^$ false match at end of file

From
Jeff King <peff@peff.net>
Date
Jan 10, 2025, 12:02 UTC
Message-ID
<20250110120223.GC1014503@coredump.intra.peff.net>
In-Reply-To
<20250110114308.GB1014503@coredump.intra.peff.net>
On Fri, Jan 10, 2025 at 06:43:08AM -0500, Jeff King wrote:
> I'll stop digging on it for now (but adding Junio to the cc as the
> author there). Probably it would have been faster just to start with a
> debugger than to look through the history. ;)
OK, my curiosity got the better of me. This fixes it:
diff --git a/grep.c b/grep.c
index 4e155ee9e6..9eac3dd95d 100644
--- a/grep.c
+++ b/grep.c
@@ -1470,10 +1470,12 @@ static int look_ahead(struct grep_opt *opt,
 		hit = patmatch(p, bol, bol + *left_p, &m, 0);
 		if (hit < 0)
 			return -1;
 		if (!hit || m.rm_so < 0 || m.rm_eo < 0)
 			continue;
+		if (m.rm_so == *left_p)
+			continue; /* don't match nothing */
 		if (earliest < 0 || m.rm_so < earliest)
 			earliest = m.rm_so;
 	}
 
 	if (earliest < 0) {

but it is weird to me that patmatch() will match "^$" to the end of the
buffer at all. It is just calling regexec_buf() behind the scenes, so I
guess this is just a weird special case there, and may even depend on
the regex implementation. If I pass "-P" to use pcre instead, the
problem goes away even without my patch.

If we skip look-ahead the problem also goes away. I'd have thought
match_line() would have the same problem, but there we process line by
line, and regexec_buf() never even sees the newline.

So I guess the rationale is: some regexec implementations are weird
about this special regex, and we should not trust their result with it
on a whole buffer with newlines.

-Peff
Previous: Jeff KingNext: Andreas Schwab
Message 3 of 5 in “git grep: ^$ false match at end of file”
  1. Olly BettsJan 9, 2025
  2. Jeff KingJan 10, 2025
  3. Jeff KingJan 10, 2025
  4. Andreas SchwabJan 10, 2025
  5. Jeff KingJan 13, 2025

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.