Re: git grep --show-function treats GOTO labels as function names
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