You start your semantic patch by matching against function calls. If you then
use a variable that is derived from that rule, you will at most get information
about called functions. If you want to find out about all functions, you have to
start by matching against all functions. Then you can have other rules that
detct properties of these functionsin various ways.
It seems that the following SmPL filter pattern shows a mostly successful
result. (I wonder why I did not get it to work yesterday.)
elfring@Sonne:~/Projekte/Coccinelle/lokal/demos/return_values> SRC=example1b.c
&& cat $SRC && LINE='-----' && echo $LINE && PAT=select_non_void_functions.cocci
&& cat $PAT && echo $LINE && spatch -sp_file $PAT $SRC
int my_safe_log(char const * text);
int my_status(void);
void my_log(char const * text) {/* Write something ... */}
int my_safe_log(char const * text) { if (!text) return 1; my_log(text); return
0; }
char const * const my_message(void) { return "Surprise!"; }
int my_status(void) { return 1; }
int my_addition(char a, char b);
int my_addition(char a, char b) { return a + b; }
int main(void) { return my_status(); }
-----
@initialize:python@
result = []
delimiter = '|'
@function_declaration@
type t;
identifier f;
position p;
@@
t f@p(...);
@is_void@
identifier function_declaration.f;
@@
void f(...);
@script:python collection depends on !is_void@
typ << function_declaration.t;
fun << function_declaration.f;
places << function_declaration.p;
@@
for place in places:
fields = []
fields.append(fun.ident)
fields.append(typ)
fields.append(place.file)
fields.append(place.line)
fields.append(place.column)
result.append(delimiter.join(fields))
@finalize:python@
if result:
result.insert(0, delimiter.join(("function", "return type", "source file",
"line", "column")))
print("\r\n".join(result))
else:
print("No result for this analysis!")
-----
init_defs_builtins: /usr/share/coccinelle/standard.h
HANDLING: example1b.c
function|return type|source file|line|column
my_safe_log|int|example1b.c|1|4
my_status|int|example1b.c|2|6
my_addition|int|example1b.c|7|8
But I would like to point out that the shown column values do still not fit to
my expectations for SmPL behaviour. Would you like to check them again in your
application environment?
Regards,
Markus
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)