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