1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun/// Find &&/|| operations that include the same argument more than once 3*4882a593Smuzhiyun//# A common source of false positives is when the expression, or 4*4882a593Smuzhiyun//# another expresssion in the same && or || operation, performs a 5*4882a593Smuzhiyun//# side effect. 6*4882a593Smuzhiyun/// 7*4882a593Smuzhiyun// Confidence: Moderate 8*4882a593Smuzhiyun// Copyright: (C) 2010 Nicolas Palix, DIKU. 9*4882a593Smuzhiyun// Copyright: (C) 2010 Julia Lawall, DIKU. 10*4882a593Smuzhiyun// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. 11*4882a593Smuzhiyun// URL: http://coccinelle.lip6.fr/ 12*4882a593Smuzhiyun// Comments: 13*4882a593Smuzhiyun// Options: --no-includes --include-headers 14*4882a593Smuzhiyun 15*4882a593Smuzhiyunvirtual context 16*4882a593Smuzhiyunvirtual org 17*4882a593Smuzhiyunvirtual report 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun@r expression@ 20*4882a593Smuzhiyunexpression E; 21*4882a593Smuzhiyunposition p; 22*4882a593Smuzhiyun@@ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun( 25*4882a593Smuzhiyun E@p || ... || E 26*4882a593Smuzhiyun| 27*4882a593Smuzhiyun E@p && ... && E 28*4882a593Smuzhiyun) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun@bad@ 31*4882a593Smuzhiyunexpression r.E,e1,e2,fn; 32*4882a593Smuzhiyunposition r.p; 33*4882a593Smuzhiyunassignment operator op; 34*4882a593Smuzhiyun@@ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun( 37*4882a593SmuzhiyunE@p 38*4882a593Smuzhiyun& 39*4882a593Smuzhiyun <+... \(fn(...)\|e1 op e2\|e1++\|e1--\|++e1\|--e1\) ...+> 40*4882a593Smuzhiyun) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun@depends on context && !bad@ 43*4882a593Smuzhiyunexpression r.E; 44*4882a593Smuzhiyunposition r.p; 45*4882a593Smuzhiyun@@ 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun*E@p 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun@script:python depends on org && !bad@ 50*4882a593Smuzhiyunp << r.p; 51*4882a593Smuzhiyun@@ 52*4882a593Smuzhiyun 53*4882a593Smuzhiyuncocci.print_main("duplicated argument to && or ||",p) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun@script:python depends on report && !bad@ 56*4882a593Smuzhiyunp << r.p; 57*4882a593Smuzhiyun@@ 58*4882a593Smuzhiyun 59*4882a593Smuzhiyuncoccilib.report.print_report(p[0],"duplicated argument to && or ||") 60