// Various iterators manage reference counts internally, and thus typically // a put is needed before breaking out of the loop, unless the current element // is saved in some way // // Confidence: Moderate // Copyright: (C) Gilles Muller, Julia Lawall, EMN, INRIA, DIKU. GPLv2. // URL: https://coccinelle.gitlabpages.inria.fr/website/rules/missing_put.html // Options: @@ local idexpression d; expression e; iterator name for_each_node_by_name; @@ for_each_node_by_name(d,...) {... when != of_node_put(d) when != e = d ( return d; | + of_node_put(d); ? return ...; ) ...} @@ local idexpression d; expression e, e1; @@ for_each_node_by_name(d,...) {... when != of_node_put(d) when != e = d + of_node_put(d); ? break; ...} ... when != of_node_put(d) when != e1 = d when != return d; // -------------------------------- @@ local idexpression d; expression e; iterator name for_each_node_by_type; @@ for_each_node_by_type(d,...) {... when != of_node_put(d) when != e = d ( return d; | + of_node_put(d); ? return ...; ) ...} @@ local idexpression d; expression e, e1; @@ for_each_node_by_type(d,...) {... when != of_node_put(d) when != e = d + of_node_put(d); ? break; ...} ... when != of_node_put(d) when != e1 = d when != return d; // -------------------------------- @@ local idexpression d; expression e; iterator name for_each_compatible_node; @@ for_each_compatible_node(d,...) {... when != of_node_put(d) when != e = d ( return d; | + of_node_put(d); ? return ...; ) ...} @@ local idexpression d; expression e, e1; @@ for_each_compatible_node(d,...) {... when != of_node_put(d) when != e = d + of_node_put(d); ? break; ...} ... when != of_node_put(d) when != e1 = d when != return d; // -------------------------------- @@ local idexpression d; expression e; iterator name shost_for_each_device; @@ shost_for_each_device(d,...) {... when != scsi_device_put(d) when != e = d ( return d; | + scsi_device_put(d); ? return ...; ) ...} @@ local idexpression d; expression e, e1; @@ shost_for_each_device(d,...) {... when != scsi_device_put(d) when != e = d + scsi_device_put(d); ? break; ...} ... when != scsi_device_put(d) when != e1 = d when != return d; @@ local idexpression d; expression e; @@ for (d = NULL; (d = of_find_all_nodes(d)) != NULL; ) {... when != of_node_put(d) when != e = d ( return d; | + of_node_put(d); ? return ...; ) ...}