Linux Audio

Check our new training course

Loading...
  1/// Device node iterators put the previous value of the index variable, so an
  2/// explicit put causes a double put.
  3///
  4// Confidence: High
  5// Copyright: (C) 2015 Julia Lawall, Inria. GPLv2.
  6// URL: http://coccinelle.lip6.fr/
  7// Options: --no-includes --include-headers
  8// Requires: 1.0.4
  9// Keywords: for_each_child_of_node, etc.
 10
 11// This uses a conjunction, which requires at least coccinelle >= 1.0.4
 12
 13virtual patch
 14virtual context
 15virtual org
 16virtual report
 17
 18@r exists@
 19expression e1,e2;
 20local idexpression n;
 21iterator name for_each_node_by_name, for_each_node_by_type,
 22for_each_compatible_node, for_each_matching_node,
 23for_each_matching_node_and_match, for_each_child_of_node,
 24for_each_available_child_of_node, for_each_node_with_property;
 25iterator i;
 26position p1,p2;
 27statement S;
 28@@
 29
 30(
 31(
 32for_each_node_by_name(n,e1) S
 33|
 34for_each_node_by_type(n,e1) S
 35|
 36for_each_compatible_node(n,e1,e2) S
 37|
 38for_each_matching_node(n,e1) S
 39|
 40for_each_matching_node_and_match(n,e1,e2) S
 41|
 42for_each_child_of_node(e1,n) S
 43|
 44for_each_available_child_of_node(e1,n) S
 45|
 46for_each_node_with_property(n,e1) S
 47)
 48&
 49i@p1(...) {
 50   ... when != of_node_get(n)
 51       when any
 52   of_node_put@p2(n);
 53   ... when any
 54}
 55)
 56
 57@s exists@
 58local idexpression r.n;
 59statement S;
 60position r.p1,r.p2;
 61iterator i;
 62@@
 63
 64 of_node_put@p2(n);
 65 ... when any
 66 i@p1(..., n, ...)
 67 S
 68
 69@t depends on s && patch && !context && !org && !report@
 70local idexpression n;
 71position r.p2;
 72@@
 73
 74- of_node_put@p2(n);
 75
 76// ----------------------------------------------------------------------------
 77
 78@t_context depends on s && !patch && (context || org || report)@
 79local idexpression n;
 80position r.p2;
 81position j0;
 82@@
 83
 84*  of_node_put@j0@p2(n);
 85
 86// ----------------------------------------------------------------------------
 87
 88@script:python t_org depends on org@
 89j0 << t_context.j0;
 90@@
 91
 92msg = "ERROR: probable double put."
 93coccilib.org.print_todo(j0[0], msg)
 94
 95// ----------------------------------------------------------------------------
 96
 97@script:python t_report depends on report@
 98j0 << t_context.j0;
 99@@
100
101msg = "ERROR: probable double put."
102coccilib.report.print_report(j0[0], msg)
103