On Sun, 4 Apr 2021, Markus Elfring wrote:
> > The following looks like what one might want to do to find #defines that
> > are near each other.
>
> I have tried another SmPL script variant out.
>
>
> @initialize:python@
> @@
> import sys
>
> records = {}
>
> class integrity_error:
> pass
>
> def store_positions(places, name, text):
> """Add source code positions to an internal table."""
> for place in places:
> key = place.file, place.line, int(place.column) + 1
>
> if key in records:
> sys.stderr.write("\n".join(["-> duplicate data",
> "file:", key[0],
> "function:", place.current_element,
> "line:", str(place.line)]))
> sys.stderr.write("\n")
> raise integrity_error
> else:
> records[key] = name, text, place.current_element
>
> @find@
> identifier i =~ "^(?:[A-Z]+_){3,3}[A-Z]+";
> expression e !~ "\"";
> position p;
> @@
> #define i@p e
>
> @script:python collection@
> i << find.i;
> e << find.e;
> places << find.p;
> @@
> store_positions(places, i, e)
>
> @finalize:python@
> @@
> if len(records) > 0:
> delimiter = "|"
> sys.stdout.write(delimiter.join(['name',
> 'text',
> 'function',
> '"source file"',
> 'line',
> 'column'
> ]))
> sys.stdout.write("\r\n")
>
> for key, value in records.items():
> sys.stdout.write(delimiter.join([value[0],
> value[1],
> value[2],
> key[0],
> key[1],
> str(key[2])
> ]))
> sys.stdout.write("\r\n")
> else:
> sys.stderr.write("No result for this analysis!\n")
>
>
> I wonder about the following test result then.
>
> elfring@Sonne:~/Projekte/PipeWire/lokal> spatch
> ~/Projekte/Coccinelle/janitor/check_define_usage.cocci
> spa/include/spa/node/type-info.h
> ā¦
> name|text|function|"source file"|line|column
> SPA_TYPE_INFO_NodeCommand|SPA_TYPE_INFO_COMMAND_BASE
> "Node"|something_else|spa/include/spa/node/type-info.h|70|1
> SPA_TYPE_INFO_IO_BASE|SPA_TYPE_INFO_IO
> ":"|something_else|spa/include/spa/node/type-info.h|39|1
> SPA_TYPE_INFO_NODE_EVENT_BASE|SPA_TYPE_INFO_NodeEvent
> ":"|something_else|spa/include/spa/node/type-info.h|56|1
> SPA_TYPE_INFO_NodeEvent|SPA_TYPE_INFO_EVENT_BASE
> "Node"|something_else|spa/include/spa/node/type-info.h|55|1
> SPA_TYPE_INFO_IO|SPA_TYPE_INFO_ENUM_BASE
> "IO"|something_else|spa/include/spa/node/type-info.h|38|1
> SPA_TYPE_INFO_NODE_COMMAND_BASE|SPA_TYPE_INFO_NodeCommand
> ":"|something_else|spa/include/spa/node/type-info.h|71|1
>
>
> I hoped that the specified constraint for the metavariable āeā would mean
> that expressions which contain a double quotation character should be excluded
> for my source code analysis approach.
> Would you like to check the observed software functionality once more?
There is perhaps a problem, but it is surely not necessary to have all of
this python code around it to see the problem. Please make a minimal
example. A rule with a match and a * in front of it should be
sufficient.
julia
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci