Re: git grep --show-function treats GOTO labels as function names
- From
Jeff King <peff@peff.net>
- Date
- May 27, 2020, 23:16 UTC
- Message-ID
- <20200527231628.GC546534@coredump.intra.peff.net>
- In-Reply-To
- <CAMP9c5m65hBXKgP76iUCGe79c_s5p106K6iwzJyPmm7fCsc7LA@mail.gmail.com>
On Wed, May 27, 2020 at 06:04:21PM -0500, Zach Riggle wrote:
Show 12 quoted lines
> It looks like that does the trick for "goto" labels, but there are
> also some issue on function name parsing with attributes when they are
> split onto a second line.
>
> $ cat attr.cpp
> int main() __attribute__ ( (no_sanitize("alignment")) )
> {
> FOO
> }
> $ git grep --no-index --show-function -e FOO attr.cpp
> attr.cpp=2=__attribute__ ( (no_sanitize("alignment")) )
> attr.cpp:4: FOOFrom your output, I assume the problematic input actually splits the attribute onto the second line?
I agree that's not ideal. The baked-in regex we use for matching C function lines is:
$ git grep -nA4 cpp userdiff.c
userdiff.c:173:PATTERNS("cpp",
userdiff.c-174- /* Jump targets or access declarations */
userdiff.c-175- "!^[ \t]*[A-Za-z_][A-Za-z_0-9]*:[[:space:]]*($|/[/*])\n"
userdiff.c-176- /* functions/methods, variables, and compounds at top level */
userdiff.c-177- "^((::[[:space:]]*)?[A-Za-z_].*)$",so we mistake it for a function name. I'm not sure how easy it is to do better, though. We can add a line like:
diff --git a/userdiff.c b/userdiff.c index 1df884ef0b..de8e1a3d72 100644 --- a/userdiff.c +++ b/userdiff.c @@ -173,6 +173,8 @@ PATTERNS("tex", "^(\\\\((sub)*section|chapter|part)\\*{0,1}\\{.*)$", PATTERNS("cpp", /* Jump targets or access declarations */ "!^[ \t]*[A-Za-z_][A-Za-z_0-9]*:[[:space:]]*($|/[/*])\n" + /* skip over attribute declarations are on their own lines */ + "!((::[[:space:]]*))?__attribute__\n" /* functions/methods, variables, and compounds at top level */ "^((::[[:space:]]*)?[A-Za-z_].*)$", /* -- */ which works for your case, but would regress: __attribute__((whatever) int main() { FOO } Handling both means skipping past the attribute, not counting it as a function, and then checking for a plausible function afterwards. That's a much trickier regex. But if you come up with something that works, I think we'd be happy to take a patch. :) You can also just override this regex via config for your personal use. If you know you'd never use that style, then the problem becomes much easier. -Peff