| Julia Lawall | 53302c1 | 2012-01-27 21:41:26 +0100 | [diff] [blame] | 1 | /// Find missing clk_puts. | 
|  | 2 | /// | 
|  | 3 | //# This only signals a missing clk_put when there is a clk_put later | 
|  | 4 | //# in the same function. | 
|  | 5 | //# False positives can be due to loops. | 
|  | 6 | // | 
|  | 7 | // Confidence: Moderate | 
|  | 8 | // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.  GPLv2. | 
|  | 9 | // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2. | 
|  | 10 | // URL: http://coccinelle.lip6.fr/ | 
|  | 11 | // Comments: | 
|  | 12 | // Options: | 
|  | 13 |  | 
|  | 14 | virtual context | 
|  | 15 | virtual org | 
|  | 16 | virtual report | 
|  | 17 |  | 
|  | 18 | @clk@ | 
|  | 19 | expression e; | 
|  | 20 | statement S,S1; | 
|  | 21 | int ret; | 
|  | 22 | position p1,p2,p3; | 
|  | 23 | @@ | 
|  | 24 |  | 
|  | 25 | e = clk_get@p1(...) | 
|  | 26 | ... when != clk_put(e) | 
|  | 27 | if (<+...e...+>) S | 
|  | 28 | ... when any | 
|  | 29 | when != clk_put(e) | 
|  | 30 | when != if (...) { ... clk_put(e); ... } | 
|  | 31 | ( | 
|  | 32 | if (ret == 0) S1 | 
|  | 33 | | | 
|  | 34 | if (...) | 
|  | 35 | { ... | 
|  | 36 | return 0; } | 
|  | 37 | | | 
|  | 38 | if (...) | 
|  | 39 | { ... | 
|  | 40 | return <+...e...+>; } | 
|  | 41 | | | 
|  | 42 | *if@p2 (...) | 
|  | 43 | { ... when != clk_put(e) | 
|  | 44 | when forall | 
|  | 45 | return@p3 ...; } | 
|  | 46 | ) | 
|  | 47 | ... when any | 
|  | 48 | clk_put(e); | 
|  | 49 |  | 
|  | 50 | @script:python depends on org@ | 
|  | 51 | p1 << clk.p1; | 
|  | 52 | p2 << clk.p2; | 
|  | 53 | p3 << clk.p3; | 
|  | 54 | @@ | 
|  | 55 |  | 
|  | 56 | cocci.print_main("clk_get",p1) | 
|  | 57 | cocci.print_secs("if",p2) | 
|  | 58 | cocci.print_secs("needed clk_put",p3) | 
|  | 59 |  | 
|  | 60 | @script:python depends on report@ | 
|  | 61 | p1 << clk.p1; | 
|  | 62 | p2 << clk.p2; | 
|  | 63 | p3 << clk.p3; | 
|  | 64 | @@ | 
|  | 65 |  | 
|  | 66 | msg = "ERROR: missing clk_put; clk_get on line %s and execution via conditional on line %s" % (p1[0].line,p2[0].line) | 
|  | 67 | coccilib.report.print_report(p3[0],msg) |