162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/// This semantic patch looks for kmalloc etc that are not followed by a
362306a36Sopenharmony_ci/// NULL check.  It only gives a report in the case where there is some
462306a36Sopenharmony_ci/// error handling code later in the function, which may be helpful
562306a36Sopenharmony_ci/// in determining what the error handling code for the call to kmalloc etc
662306a36Sopenharmony_ci/// should be.
762306a36Sopenharmony_ci///
862306a36Sopenharmony_ci// Confidence: High
962306a36Sopenharmony_ci// Copyright: (C) 2010 Nicolas Palix, DIKU.
1062306a36Sopenharmony_ci// Copyright: (C) 2010 Julia Lawall, DIKU.
1162306a36Sopenharmony_ci// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
1262306a36Sopenharmony_ci// URL: https://coccinelle.gitlabpages.inria.fr/website
1362306a36Sopenharmony_ci// Comments:
1462306a36Sopenharmony_ci// Options: --no-includes --include-headers
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_civirtual context
1762306a36Sopenharmony_civirtual org
1862306a36Sopenharmony_civirtual report
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci@withtest@
2162306a36Sopenharmony_ciexpression x;
2262306a36Sopenharmony_ciposition p;
2362306a36Sopenharmony_ciidentifier f,fld;
2462306a36Sopenharmony_ci@@
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cix@p = f(...);
2762306a36Sopenharmony_ci... when != x->fld
2862306a36Sopenharmony_ci\(x == NULL \| x != NULL\)
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci@fixed depends on context && !org && !report@
3162306a36Sopenharmony_ciexpression x,x1;
3262306a36Sopenharmony_ciposition p1 != withtest.p;
3362306a36Sopenharmony_cistatement S;
3462306a36Sopenharmony_ciposition any withtest.p;
3562306a36Sopenharmony_ciidentifier f;
3662306a36Sopenharmony_ci@@
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci*x@p1 = \(kmalloc\|kzalloc\|kcalloc\)(...);
3962306a36Sopenharmony_ci...
4062306a36Sopenharmony_ci*x1@p = f(...);
4162306a36Sopenharmony_ciif (!x1) S
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci// ------------------------------------------------------------------------
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci@rfixed depends on (org || report) && !context exists@
4662306a36Sopenharmony_ciexpression x,x1;
4762306a36Sopenharmony_ciposition p1 != withtest.p;
4862306a36Sopenharmony_ciposition p2;
4962306a36Sopenharmony_cistatement S;
5062306a36Sopenharmony_ciposition any withtest.p;
5162306a36Sopenharmony_ciidentifier f;
5262306a36Sopenharmony_ci@@
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cix@p1 = \(kmalloc\|kzalloc\|kcalloc\)(...);
5562306a36Sopenharmony_ci...
5662306a36Sopenharmony_cix1@p = f@p2(...);
5762306a36Sopenharmony_ciif (!x1) S
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci@script:python depends on org@
6062306a36Sopenharmony_cip1 << rfixed.p1;
6162306a36Sopenharmony_cip2 << rfixed.p2;
6262306a36Sopenharmony_ci@@
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cicocci.print_main("alloc call",p1)
6562306a36Sopenharmony_cicocci.print_secs("possible model",p2)
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci@script:python depends on report@
6862306a36Sopenharmony_cip1 << rfixed.p1;
6962306a36Sopenharmony_cip2 << rfixed.p2;
7062306a36Sopenharmony_ci@@
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cimsg = "alloc with no test, possible model on line %s" % (p2[0].line)
7362306a36Sopenharmony_cicoccilib.report.print_report(p1[0],msg)
74