On Mon, 26 Dec 2011, SF Markus Elfring wrote:

Please make a smaller example. In your example try to delete everything that you can without changing what you consider to be the undesirableness of the result.

Is the following approach for a source code analysis better for a simple test and illustration?

It is better, but things like return "surprise" return 1 and return a + a contribute nothing to the understanding of the example. Coccinelle doesn't care if your functions don't type check. I have a small screen. It is easiest if I can see everything related to the example in say 20 lines. Making the example smaller also helps you better understand the problem. Here for example you are interested in calls to void functions, but all of the other noise makes it hard to see where the function calls are. The example should ideally contain nothing but functions and function calls, if that is enough to see the problem.

elfring@Sonne:~/Projekte/Coccinelle/lokal/demos/return_values> SRC=example1.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@
identifier f;
position p;
@@
f@p(...);

@is_void@
identifier function_declaration.f;
@@
void f(...);

@script:python collection depends on !is_void@
fun << function_declaration.f;
places << function_declaration.p;
@@
for place in places:
   fields = []
   fields.append(fun.ident)
   fields.append("declaration")
   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", "action", "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: example1.c
function|action|source file|line|column
my_log|declaration|example1.c|14|2


I would expect that the functions "my_safe_log", "my_status" and "my_addition" will be displayed together with their attributes in the test result.

Would you like to suggest any more adjustments?

You only print out information about functions that are called (function_definition.f). As far as I can see, my_addition is never called. So it is not printed.

julia
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)

Reply via email to