17f904d7eSThomas Gleixner// SPDX-License-Identifier: GPL-2.0-only
2e8fa600eSJulia Lawall/// PTR_ERR should access the value just tested by IS_ERR
302da7b42SJulia Lawall//# There can be false positives in the patch case, where it is the call to
4e8fa600eSJulia Lawall//# IS_ERR that is wrong.
5e8fa600eSJulia Lawall///
6e8fa600eSJulia Lawall// Confidence: High
77f904d7eSThomas Gleixner// Copyright: (C) 2012, 2015 Julia Lawall, INRIA.
87f904d7eSThomas Gleixner// Copyright: (C) 2012, 2015 Gilles Muller, INRIA.
9*f01701ceSJulia Lawall// URL: https://coccinelle.gitlabpages.inria.fr/website
1093f14468SNicolas Palix// Options: --no-includes --include-headers
11e8fa600eSJulia Lawall
12e8fa600eSJulia Lawallvirtual patch
13e8fa600eSJulia Lawallvirtual context
14e8fa600eSJulia Lawallvirtual org
15e8fa600eSJulia Lawallvirtual report
16e8fa600eSJulia Lawall
1702da7b42SJulia Lawall@ok1 exists@
1802da7b42SJulia Lawallexpression x,e;
1902da7b42SJulia Lawallposition p;
20e8fa600eSJulia Lawall@@
21e8fa600eSJulia Lawall
2202da7b42SJulia Lawallif (IS_ERR(x=e) || ...) {
2302da7b42SJulia Lawall  <...
2402da7b42SJulia Lawall   PTR_ERR@p(x)
2502da7b42SJulia Lawall  ...>
2602da7b42SJulia Lawall}
2702da7b42SJulia Lawall
2802da7b42SJulia Lawall@ok2 exists@
2902da7b42SJulia Lawallexpression x,e1,e2;
3002da7b42SJulia Lawallposition p;
3102da7b42SJulia Lawall@@
3202da7b42SJulia Lawall
3302da7b42SJulia Lawallif (IS_ERR(x) || ...) {
3402da7b42SJulia Lawall  <...
35e8fa600eSJulia Lawall(
3602da7b42SJulia Lawall   PTR_ERR@p(\(e1 ? e2 : x\|e1 ? x : e2\))
37e8fa600eSJulia Lawall|
3802da7b42SJulia Lawall   PTR_ERR@p(x)
39e8fa600eSJulia Lawall)
4002da7b42SJulia Lawall  ...>
4102da7b42SJulia Lawall}
42e8fa600eSJulia Lawall
4302da7b42SJulia Lawall@r1 depends on patch && !context && !org && !report exists@
4402da7b42SJulia Lawallexpression x,y;
4502da7b42SJulia Lawallposition p != {ok1.p,ok2.p};
46e8fa600eSJulia Lawall@@
47e8fa600eSJulia Lawall
4802da7b42SJulia Lawallif (IS_ERR(x) || ...) {
4902da7b42SJulia Lawall  ... when any
5002da7b42SJulia Lawall      when != IS_ERR(...)
51e8fa600eSJulia Lawall(
5202da7b42SJulia Lawall  PTR_ERR(x)
53e8fa600eSJulia Lawall|
5402da7b42SJulia Lawall  PTR_ERR@p(
5502da7b42SJulia Lawall-     y
5602da7b42SJulia Lawall+     x
57e8fa600eSJulia Lawall  )
5802da7b42SJulia Lawall)
5902da7b42SJulia Lawall  ... when any
6002da7b42SJulia Lawall}
61e8fa600eSJulia Lawall
6202da7b42SJulia Lawall// ----------------------------------------------------------------------------
6302da7b42SJulia Lawall
6402da7b42SJulia Lawall@r1_context depends on !patch && (context || org || report) exists@
6502da7b42SJulia Lawallposition p != {ok1.p,ok2.p};
6602da7b42SJulia Lawallexpression x, y;
6702da7b42SJulia Lawallposition j0, j1;
68e8fa600eSJulia Lawall@@
69e8fa600eSJulia Lawall
7002da7b42SJulia Lawallif (IS_ERR@j0(x) || ...) {
7102da7b42SJulia Lawall  ... when any
7202da7b42SJulia Lawall      when != IS_ERR(...)
7302da7b42SJulia Lawall(
7402da7b42SJulia Lawall  PTR_ERR(x)
7502da7b42SJulia Lawall|
7602da7b42SJulia Lawall  PTR_ERR@j1@p(
7702da7b42SJulia Lawall     y
7802da7b42SJulia Lawall  )
7902da7b42SJulia Lawall)
8002da7b42SJulia Lawall  ... when any
8102da7b42SJulia Lawall}
82e8fa600eSJulia Lawall
8302da7b42SJulia Lawall@r1_disj depends on !patch && (context || org || report) exists@
8402da7b42SJulia Lawallposition p != {ok1.p,ok2.p};
8502da7b42SJulia Lawallexpression x, y;
8602da7b42SJulia Lawallposition r1_context.j0, r1_context.j1;
87e8fa600eSJulia Lawall@@
88e8fa600eSJulia Lawall
8902da7b42SJulia Lawall* if (IS_ERR@j0(x) || ...) {
9002da7b42SJulia Lawall  ... when any
9102da7b42SJulia Lawall      when != IS_ERR(...)
9202da7b42SJulia Lawall*   PTR_ERR@j1@p(
9302da7b42SJulia Lawall     y
9402da7b42SJulia Lawall  )
9502da7b42SJulia Lawall  ... when any
9602da7b42SJulia Lawall}
9702da7b42SJulia Lawall
9802da7b42SJulia Lawall// ----------------------------------------------------------------------------
9902da7b42SJulia Lawall
10002da7b42SJulia Lawall@script:python r1_org depends on org@
10102da7b42SJulia Lawallj0 << r1_context.j0;
10202da7b42SJulia Lawallj1 << r1_context.j1;
10302da7b42SJulia Lawall@@
10402da7b42SJulia Lawall
10502da7b42SJulia Lawallmsg = "inconsistent IS_ERR and PTR_ERR"
10602da7b42SJulia Lawallcoccilib.org.print_todo(j0[0], msg)
10702da7b42SJulia Lawallcoccilib.org.print_link(j1[0], "")
10802da7b42SJulia Lawall
10902da7b42SJulia Lawall// ----------------------------------------------------------------------------
11002da7b42SJulia Lawall
11102da7b42SJulia Lawall@script:python r1_report depends on report@
11202da7b42SJulia Lawallj0 << r1_context.j0;
11302da7b42SJulia Lawallj1 << r1_context.j1;
11402da7b42SJulia Lawall@@
11502da7b42SJulia Lawall
11602da7b42SJulia Lawallmsg = "inconsistent IS_ERR and PTR_ERR on line %s." % (j1[0].line)
11702da7b42SJulia Lawallcoccilib.report.print_report(j0[0], msg)
11802da7b42SJulia Lawall
119