Resguardo inicial

This commit is contained in:
lastdragon
2026-09-06 12:53:21 -06:00
parent 662efe3c2a
commit ad2088d178
94853 changed files with 43200404 additions and 0 deletions
@@ -0,0 +1,31 @@
// SPDX-License-Identifier: GPL-2.0-only
//
/// Adds missing MODULE_IMPORT_NS statements to source files
///
/// This script is usually called from scripts/nsdeps with -D ns=<namespace> to
/// add a missing namespace tag to a module source file.
///
virtual nsdeps
virtual report
@has_ns_import@
declarer name MODULE_IMPORT_NS;
identifier virtual.ns;
@@
MODULE_IMPORT_NS(ns);
// Add missing imports, but only adjacent to a MODULE_LICENSE statement.
// That ensures we are adding it only to the main module source file.
@do_import depends on !has_ns_import && nsdeps@
declarer name MODULE_LICENSE;
expression license;
identifier virtual.ns;
@@
MODULE_LICENSE(license);
+ MODULE_IMPORT_NS(ns);
// Dummy rule for report mode that would otherwise be empty and make spatch
// fail ("No rules apply.")
@script:python depends on report@
@@
@@ -0,0 +1,88 @@
// SPDX-License-Identifier: GPL-2.0-only
/// Use ARRAY_SIZE instead of dividing sizeof array with sizeof an element
///
//# This makes an effort to find cases where ARRAY_SIZE can be used such as
//# where there is a division of sizeof the array by the sizeof its first
//# element or by any indexed element or the element type. It replaces the
//# division of the two sizeofs by ARRAY_SIZE.
//
// Confidence: High
// Copyright: (C) 2014 Himangi Saraogi.
// Comments:
// Options: --no-includes --include-headers
virtual patch
virtual context
virtual org
virtual report
@i@
@@
#include <linux/kernel.h>
//----------------------------------------------------------
// For context mode
//----------------------------------------------------------
@depends on i&&context@
type T;
T[] E;
@@
(
* (sizeof(E)/sizeof(*E))
|
* (sizeof(E)/sizeof(E[...]))
|
* (sizeof(E)/sizeof(T))
)
//----------------------------------------------------------
// For patch mode
//----------------------------------------------------------
@depends on i&&patch@
type T;
T[] E;
@@
(
- (sizeof(E)/sizeof(*E))
+ ARRAY_SIZE(E)
|
- (sizeof(E)/sizeof(E[...]))
+ ARRAY_SIZE(E)
|
- (sizeof(E)/sizeof(T))
+ ARRAY_SIZE(E)
)
//----------------------------------------------------------
// For org and report mode
//----------------------------------------------------------
@r depends on (org || report)@
type T;
T[] E;
position p;
@@
(
(sizeof(E)@p /sizeof(*E))
|
(sizeof(E)@p /sizeof(E[...]))
|
(sizeof(E)@p /sizeof(T))
)
@script:python depends on org@
p << r.p;
@@
coccilib.org.print_todo(p[0], "WARNING should use ARRAY_SIZE")
@script:python depends on report@
p << r.p;
@@
msg="WARNING: Use ARRAY_SIZE"
coccilib.report.print_report(p[0], msg)
@@ -0,0 +1,209 @@
// SPDX-License-Identifier: GPL-2.0-only
///
/// Check for array_size(), array3_size(), struct_size() duplicates.
/// These patterns are detected:
/// 1. An opencoded expression is used before array_size() to compute the same size
/// 2. An opencoded expression is used after array_size() to compute the same size
/// From security point of view only first case is relevant. These functions
/// perform arithmetic overflow check. Thus, if we use an opencoded expression
/// before a call to the *_size() function we can miss an overflow.
///
// Confidence: High
// Copyright: (C) 2020 Denis Efremov ISPRAS
// Options: --no-includes --include-headers --no-loops
virtual context
virtual report
virtual org
@as@
expression E1, E2;
@@
array_size(E1, E2)
@as_next@
expression subE1 <= as.E1;
expression subE2 <= as.E2;
expression as.E1, as.E2, E3;
assignment operator aop;
position p1, p2;
@@
* E1 * E2@p1
... when != \(subE1\|subE2\) aop E3
when != &\(subE1\|subE2\)
* array_size(E1, E2)@p2
@script:python depends on report@
p1 << as_next.p1;
p2 << as_next.p2;
@@
msg = "WARNING: array_size is used later (line %s) to compute the same size" % (p2[0].line)
coccilib.report.print_report(p1[0], msg)
@script:python depends on org@
p1 << as_next.p1;
p2 << as_next.p2;
@@
msg = "WARNING: array_size is used later (line %s) to compute the same size" % (p2[0].line)
coccilib.org.print_todo(p1[0], msg)
@as_prev@
expression subE1 <= as.E1;
expression subE2 <= as.E2;
expression as.E1, as.E2, E3;
assignment operator aop;
position p1, p2;
@@
* array_size(E1, E2)@p1
... when != \(subE1\|subE2\) aop E3
when != &\(subE1\|subE2\)
* E1 * E2@p2
@script:python depends on report@
p1 << as_prev.p1;
p2 << as_prev.p2;
@@
msg = "WARNING: array_size is already used (line %s) to compute the same size" % (p1[0].line)
coccilib.report.print_report(p2[0], msg)
@script:python depends on org@
p1 << as_prev.p1;
p2 << as_prev.p2;
@@
msg = "WARNING: array_size is already used (line %s) to compute the same size" % (p1[0].line)
coccilib.org.print_todo(p2[0], msg)
@as3@
expression E1, E2, E3;
@@
array3_size(E1, E2, E3)
@as3_next@
expression subE1 <= as3.E1;
expression subE2 <= as3.E2;
expression subE3 <= as3.E3;
expression as3.E1, as3.E2, as3.E3, E4;
assignment operator aop;
position p1, p2;
@@
* E1 * E2 * E3@p1
... when != \(subE1\|subE2\|subE3\) aop E4
when != &\(subE1\|subE2\|subE3\)
* array3_size(E1, E2, E3)@p2
@script:python depends on report@
p1 << as3_next.p1;
p2 << as3_next.p2;
@@
msg = "WARNING: array3_size is used later (line %s) to compute the same size" % (p2[0].line)
coccilib.report.print_report(p1[0], msg)
@script:python depends on org@
p1 << as3_next.p1;
p2 << as3_next.p2;
@@
msg = "WARNING: array3_size is used later (line %s) to compute the same size" % (p2[0].line)
coccilib.org.print_todo(p1[0], msg)
@as3_prev@
expression subE1 <= as3.E1;
expression subE2 <= as3.E2;
expression subE3 <= as3.E3;
expression as3.E1, as3.E2, as3.E3, E4;
assignment operator aop;
position p1, p2;
@@
* array3_size(E1, E2, E3)@p1
... when != \(subE1\|subE2\|subE3\) aop E4
when != &\(subE1\|subE2\|subE3\)
* E1 * E2 * E3@p2
@script:python depends on report@
p1 << as3_prev.p1;
p2 << as3_prev.p2;
@@
msg = "WARNING: array3_size is already used (line %s) to compute the same size" % (p1[0].line)
coccilib.report.print_report(p2[0], msg)
@script:python depends on org@
p1 << as3_prev.p1;
p2 << as3_prev.p2;
@@
msg = "WARNING: array3_size is already used (line %s) to compute the same size" % (p1[0].line)
coccilib.org.print_todo(p2[0], msg)
@ss@
expression E1, E2, E3;
@@
struct_size(E1, E2, E3)
@ss_next@
expression subE3 <= ss.E3;
expression ss.E1, ss.E2, ss.E3, E4;
assignment operator aop;
position p1, p2;
@@
* E1 * E2 + E3@p1
... when != subE3 aop E4
when != &subE3
* struct_size(E1, E2, E3)@p2
@script:python depends on report@
p1 << ss_next.p1;
p2 << ss_next.p2;
@@
msg = "WARNING: struct_size is used later (line %s) to compute the same size" % (p2[0].line)
coccilib.report.print_report(p1[0], msg)
@script:python depends on org@
p1 << ss_next.p1;
p2 << ss_next.p2;
@@
msg = "WARNING: struct_size is used later (line %s) to compute the same size" % (p2[0].line)
coccilib.org.print_todo(p1[0], msg)
@ss_prev@
expression subE3 <= ss.E3;
expression ss.E1, ss.E2, ss.E3, E4;
assignment operator aop;
position p1, p2;
@@
* struct_size(E1, E2, E3)@p1
... when != subE3 aop E4
when != &subE3
* E1 * E2 + E3@p2
@script:python depends on report@
p1 << ss_prev.p1;
p2 << ss_prev.p2;
@@
msg = "WARNING: struct_size is already used (line %s) to compute the same size" % (p1[0].line)
coccilib.report.print_report(p2[0], msg)
@script:python depends on org@
p1 << ss_prev.p1;
p2 << ss_prev.p2;
@@
msg = "WARNING: struct_size is already used (line %s) to compute the same size" % (p1[0].line)
coccilib.org.print_todo(p2[0], msg)
@@ -0,0 +1,77 @@
// SPDX-License-Identifier: GPL-2.0-only
/// Correct the size argument to alloc functions
///
//# This makes an effort to find cases where the argument to sizeof is wrong
//# in memory allocation functions by checking the type of the allocated memory
//# when it is a double pointer and ensuring the sizeof argument takes a pointer
//# to the the memory being allocated. There are false positives in cases the
//# sizeof argument is not used in constructing the return value. The result
//# may need some reformatting.
//
// Confidence: Moderate
// Copyright: (C) 2014 Himangi Saraogi.
// Comments:
// Options:
virtual patch
virtual context
virtual org
virtual report
//----------------------------------------------------------
// For context mode
//----------------------------------------------------------
@depends on context disable sizeof_type_expr@
type T;
T **x;
@@
x =
<+...sizeof(
* T
)...+>
//----------------------------------------------------------
// For patch mode
//----------------------------------------------------------
@depends on patch disable sizeof_type_expr@
type T;
T **x;
@@
x =
<+...sizeof(
- T
+ *x
)...+>
//----------------------------------------------------------
// For org and report mode
//----------------------------------------------------------
@r depends on (org || report) disable sizeof_type_expr@
type T;
T **x;
position p;
@@
x =
<+...sizeof(
T@p
)...+>
@script:python depends on org@
p << r.p;
@@
coccilib.org.print_todo(p[0], "WARNING sizeof argument should be pointer type, not structure type")
@script:python depends on report@
p << r.p;
@@
msg="WARNING: Use correct pointer type argument for sizeof"
coccilib.report.print_report(p[0], msg)
@@ -0,0 +1,91 @@
// SPDX-License-Identifier: GPL-2.0-only
/// Remove unneeded conversion to bool
///
//# Relational and logical operators evaluate to bool,
//# explicit conversion is overly verbose and unneeded.
//
// Copyright: (C) 2016 Andrew F. Davis <afd@ti.com>
virtual patch
virtual context
virtual org
virtual report
//----------------------------------------------------------
// For patch mode
//----------------------------------------------------------
@depends on patch@
expression A, B;
symbol true, false;
@@
(
A == B
|
A != B
|
A > B
|
A < B
|
A >= B
|
A <= B
|
A && B
|
A || B
)
- ? true : false
//----------------------------------------------------------
// For context mode
//----------------------------------------------------------
@r depends on !patch@
expression A, B;
symbol true, false;
position p;
@@
(
A == B
|
A != B
|
A > B
|
A < B
|
A >= B
|
A <= B
|
A && B
|
A || B
)
* ? true : false@p
//----------------------------------------------------------
// For org mode
//----------------------------------------------------------
@script:python depends on r&&org@
p << r.p;
@@
msg = "WARNING: conversion to bool not needed here"
coccilib.org.print_todo(p[0], msg)
//----------------------------------------------------------
// For report mode
//----------------------------------------------------------
@script:python depends on r&&report@
p << r.p;
@@
msg = "WARNING: conversion to bool not needed here"
coccilib.report.print_report(p[0], msg)
@@ -0,0 +1,65 @@
// SPDX-License-Identifier: GPL-2.0-only
///Find conditions where if and else branch are functionally
// identical.
//
// There can be false positives in cases where the positional
// information is used (as with lockdep) or where the identity
// is a placeholder for not yet handled cases.
// Unfortunately there also seems to be a tendency to use
// the last if else/else as a "default behavior" - which some
// might consider a legitimate coding pattern. From discussion
// on kernelnewbies though it seems that this is not really an
// accepted pattern and if at all it would need to be commented
//
// In the Linux kernel it does not seem to actually report
// false positives except for those that were documented as
// being intentional.
// the two known cases are:
// arch/sh/kernel/traps_64.c:read_opcode()
// } else if ((pc & 1) == 0) {
// /* SHcompact */
// /* TODO : provide handling for this. We don't really support
// user-mode SHcompact yet, and for a kernel fault, this would
// have to come from a module built for SHcompact. */
// return -EFAULT;
// } else {
// /* misaligned */
// return -EFAULT;
// }
// fs/kernfs/file.c:kernfs_fop_open()
// * Both paths of the branch look the same. They're supposed to
// * look that way and give @of->mutex different static lockdep keys.
// */
// if (has_mmap)
// mutex_init(&of->mutex);
// else
// mutex_init(&of->mutex);
//
// All other cases look like bugs or at least lack of documentation
//
// Confidence: Moderate
// Copyright: (C) 2016 Nicholas Mc Guire, OSADL.
// Comments:
// Options: --no-includes --include-headers
virtual org
virtual report
@cond@
statement S1;
position p;
@@
* if@p (...) S1 else S1
@script:python depends on org@
p << cond.p;
@@
cocci.print_main("WARNING: possible condition with no effect (if == else)",p)
@script:python depends on report@
p << cond.p;
@@
coccilib.report.print_report(p[0],"WARNING: possible condition with no effect (if == else)")
@@ -0,0 +1,42 @@
// SPDX-License-Identifier: GPL-2.0-only
/// PTR_ERR should be applied before its argument is reassigned, typically
/// to NULL
///
// Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
// URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments:
// Options: --no-includes --include-headers
virtual org
virtual report
virtual context
@r exists@
expression e,e1;
constant c;
position p1,p2;
@@
*e@p1 = c
... when != e = e1
when != &e
when != true IS_ERR(e)
*PTR_ERR@p2(e)
@script:python depends on org@
p1 << r.p1;
p2 << r.p2;
@@
cocci.print_main("PTR_ERR",p2)
cocci.print_secs("assignment",p1)
@script:python depends on report@
p1 << r.p1;
p2 << r.p2;
@@
msg = "ERROR: PTR_ERR applied after initialization to constant on line %s" % (p1[0].line)
coccilib.report.print_report(p2[0],msg)
@@ -0,0 +1,155 @@
// SPDX-License-Identifier: GPL-2.0-only
/// do_div() does a 64-by-32 division.
/// When the divisor is long, unsigned long, u64, or s64,
/// do_div() truncates it to 32 bits, this means it can test
/// non-zero and be truncated to 0 for division on 64bit platforms.
///
//# This makes an effort to find those inappropriate do_div() calls.
//
// Confidence: Moderate
// Copyright: (C) 2020 Wen Yang, Alibaba.
// Comments:
// Options: --no-includes --include-headers
virtual context
virtual org
virtual report
@initialize:python@
@@
def get_digit_type_and_value(str):
is_digit = False
value = 0
try:
if (str.isdigit()):
is_digit = True
value = int(str, 0)
elif (str.upper().endswith('ULL')):
is_digit = True
value = int(str[:-3], 0)
elif (str.upper().endswith('LL')):
is_digit = True
value = int(str[:-2], 0)
elif (str.upper().endswith('UL')):
is_digit = True
value = int(str[:-2], 0)
elif (str.upper().endswith('L')):
is_digit = True
value = int(str[:-1], 0)
elif (str.upper().endswith('U')):
is_digit = True
value = int(str[:-1], 0)
except Exception as e:
print('Error:',e)
is_digit = False
value = 0
finally:
return is_digit, value
def filter_out_safe_constants(str):
is_digit, value = get_digit_type_and_value(str)
if (is_digit):
if (value >= 0x100000000):
return True
else:
return False
else:
return True
def construct_warnings(suggested_fun):
msg="WARNING: do_div() does a 64-by-32 division, please consider using %s instead."
return msg % suggested_fun
@depends on context@
expression f;
long l: script:python() { filter_out_safe_constants(l) };
unsigned long ul : script:python() { filter_out_safe_constants(ul) };
u64 ul64 : script:python() { filter_out_safe_constants(ul64) };
s64 sl64 : script:python() { filter_out_safe_constants(sl64) };
@@
(
* do_div(f, l);
|
* do_div(f, ul);
|
* do_div(f, ul64);
|
* do_div(f, sl64);
)
@r depends on (org || report)@
expression f;
position p;
long l: script:python() { filter_out_safe_constants(l) };
unsigned long ul : script:python() { filter_out_safe_constants(ul) };
u64 ul64 : script:python() { filter_out_safe_constants(ul64) };
s64 sl64 : script:python() { filter_out_safe_constants(sl64) };
@@
(
do_div@p(f, l);
|
do_div@p(f, ul);
|
do_div@p(f, ul64);
|
do_div@p(f, sl64);
)
@script:python depends on org@
p << r.p;
ul << r.ul;
@@
coccilib.org.print_todo(p[0], construct_warnings("div64_ul"))
@script:python depends on org@
p << r.p;
l << r.l;
@@
coccilib.org.print_todo(p[0], construct_warnings("div64_long"))
@script:python depends on org@
p << r.p;
ul64 << r.ul64;
@@
coccilib.org.print_todo(p[0], construct_warnings("div64_u64"))
@script:python depends on org@
p << r.p;
sl64 << r.sl64;
@@
coccilib.org.print_todo(p[0], construct_warnings("div64_s64"))
@script:python depends on report@
p << r.p;
ul << r.ul;
@@
coccilib.report.print_report(p[0], construct_warnings("div64_ul"))
@script:python depends on report@
p << r.p;
l << r.l;
@@
coccilib.report.print_report(p[0], construct_warnings("div64_long"))
@script:python depends on report@
p << r.p;
sl64 << r.sl64;
@@
coccilib.report.print_report(p[0], construct_warnings("div64_s64"))
@script:python depends on report@
p << r.p;
ul64 << r.ul64;
@@
coccilib.report.print_report(p[0], construct_warnings("div64_u64"))
@@ -0,0 +1,54 @@
// SPDX-License-Identifier: GPL-2.0-only
/// Find duplicate field initializations. This has a high rate of false
/// positives due to #ifdefs, which Coccinelle is not aware of in a structure
/// initialization.
///
// Confidence: Low
// Copyright: (C) 2010-2012 Nicolas Palix.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
// URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: requires at least Coccinelle 0.2.4, lex or parse error otherwise
// Options: --no-includes --include-headers
virtual org
virtual report
@r@
identifier I, s, fld;
position p0,p;
expression E;
@@
struct I s =@p0 { ..., .fld@p = E, ...};
@s@
identifier I, s, r.fld;
position r.p0,p;
expression E;
@@
struct I s =@p0 { ..., .fld@p = E, ...};
@script:python depends on org@
p0 << r.p0;
fld << r.fld;
ps << s.p;
pr << r.p;
@@
if int(ps[0].line) < int(pr[0].line) or (int(ps[0].line) == int(pr[0].line) and int(ps[0].column) < int(pr[0].column)):
cocci.print_main(fld,p0)
cocci.print_secs("s",ps)
cocci.print_secs("r",pr)
@script:python depends on report@
p0 << r.p0;
fld << r.fld;
ps << s.p;
pr << r.p;
@@
if int(ps[0].line) < int(pr[0].line) or (int(ps[0].line) == int(pr[0].line) and int(ps[0].column) < int(pr[0].column)):
msg = "%s: first occurrence line %s, second occurrence line %s" % (fld,ps[0].line,pr[0].line)
coccilib.report.print_report(p0[0],msg)
@@ -0,0 +1,39 @@
// SPDX-License-Identifier: GPL-2.0-only
///
/// Condition !A || A && B is equivalent to !A || B.
///
// Confidence: High
// Copyright: (C) 2020 Denis Efremov ISPRAS
// Options: --no-includes --include-headers
virtual patch
virtual context
virtual org
virtual report
@r depends on !patch@
expression A, B;
position p;
@@
* !A || (A &&@p B)
@depends on patch@
expression A, B;
@@
!A ||
- (A && B)
+ B
@script:python depends on report@
p << r.p;
@@
coccilib.report.print_report(p[0], "WARNING !A || A && B is equivalent to !A || B")
@script:python depends on org@
p << r.p;
@@
coccilib.org.print_todo(p[0], "WARNING !A || A && B is equivalent to !A || B")
@@ -0,0 +1,107 @@
// SPDX-License-Identifier: GPL-2.0-only
///
/// Zero-length and one-element arrays are deprecated, see
/// Documentation/process/deprecated.rst
/// Flexible-array members should be used instead.
///
//
// Confidence: High
// Copyright: (C) 2020 Denis Efremov ISPRAS.
// Comments:
// Options: --no-includes --include-headers
virtual context
virtual report
virtual org
virtual patch
@initialize:python@
@@
def relevant(positions):
for p in positions:
if "uapi" in p.file:
return False
return True
@r depends on !patch@
identifier name, array;
type T;
position p : script:python() { relevant(p) };
@@
(
struct name {
...
* T array@p[\(0\|1\)];
};
|
struct {
...
* T array@p[\(0\|1\)];
};
|
union name {
...
* T array@p[\(0\|1\)];
};
|
union {
...
* T array@p[\(0\|1\)];
};
)
@only_field depends on patch@
identifier name, array;
type T;
position q;
@@
(
struct name {@q
T array[0];
};
|
struct {@q
T array[0];
};
)
@depends on patch@
identifier name, array;
type T;
position p : script:python() { relevant(p) };
// position @q with rule "only_field" simplifies
// handling of bitfields, arrays, etc.
position q != only_field.q;
@@
(
struct name {@q
...
T array@p[
- 0
];
};
|
struct {@q
...
T array@p[
- 0
];
};
)
@script: python depends on report@
p << r.p;
@@
msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)"
coccilib.report.print_report(p[0], msg)
@script: python depends on org@
p << r.p;
@@
msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)"
coccilib.org.print_todo(p[0], msg)
@@ -0,0 +1,49 @@
// SPDX-License-Identifier: GPL-2.0-only
/// Find confusingly indented code in or after an if. An if branch should
/// be indented. The code following an if should not be indented.
/// Sometimes, code after an if that is indented is actually intended to be
/// part of the if branch.
///
//# This has a high rate of false positives, because Coccinelle's column
//# calculation does not distinguish between spaces and tabs, so code that
//# is not visually aligned may be considered to be in the same column.
//
// Confidence: Low
// Copyright: (C) 2010 Nicolas Palix, DIKU.
// Copyright: (C) 2010 Julia Lawall, DIKU.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
// URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments:
// Options: --no-includes --include-headers
virtual org
virtual report
@r disable braces4@
position p1,p2;
statement S1,S2;
@@
(
if (...) { ... }
|
if (...) S1@p1 S2@p2
)
@script:python depends on org@
p1 << r.p1;
p2 << r.p2;
@@
if (p1[0].column == p2[0].column):
cocci.print_main("branch",p1)
cocci.print_secs("after",p2)
@script:python depends on report@
p1 << r.p1;
p2 << r.p2;
@@
if (p1[0].column == p2[0].column):
msg = "code aligned with following code on line %s" % (p2[0].line)
coccilib.report.print_report(p1[0],msg)
@@ -0,0 +1,113 @@
// SPDX-License-Identifier: GPL-2.0
/// Since commit 1c6c69525b40 ("genirq: Reject bogus threaded irq requests")
/// threaded IRQs without a primary handler need to be requested with
/// IRQF_ONESHOT, otherwise the request will fail.
///
/// So pass the IRQF_ONESHOT flag in this case.
///
//
// Confidence: Moderate
// Comments:
// Options: --no-includes
virtual patch
virtual context
virtual org
virtual report
@r1@
expression dev, irq, thread_fn;
position p;
@@
(
request_threaded_irq@p(irq, NULL, thread_fn,
(
IRQF_ONESHOT | ...
|
IRQF_ONESHOT
)
, ...)
|
devm_request_threaded_irq@p(dev, irq, NULL, thread_fn,
(
IRQF_ONESHOT | ...
|
IRQF_ONESHOT
)
, ...)
)
@r2@
expression dev, irq, thread_fn, flags, e;
position p != r1.p;
@@
(
flags = IRQF_ONESHOT | ...
|
flags |= IRQF_ONESHOT | ...
)
... when != flags = e
(
request_threaded_irq@p(irq, NULL, thread_fn, flags, ...);
|
devm_request_threaded_irq@p(dev, irq, NULL, thread_fn, flags, ...);
)
@depends on patch@
expression dev, irq, thread_fn, flags;
position p != {r1.p,r2.p};
@@
(
request_threaded_irq@p(irq, NULL, thread_fn,
(
-0
+IRQF_ONESHOT
|
-flags
+flags | IRQF_ONESHOT
)
, ...)
|
devm_request_threaded_irq@p(dev, irq, NULL, thread_fn,
(
-0
+IRQF_ONESHOT
|
-flags
+flags | IRQF_ONESHOT
)
, ...)
)
@depends on context@
expression dev, irq;
position p != {r1.p,r2.p};
@@
(
*request_threaded_irq@p(irq, NULL, ...)
|
*devm_request_threaded_irq@p(dev, irq, NULL, ...)
)
@match depends on report || org@
expression dev, irq;
position p != {r1.p,r2.p};
@@
(
request_threaded_irq@p(irq, NULL, ...)
|
devm_request_threaded_irq@p(dev, irq, NULL, ...)
)
@script:python depends on org@
p << match.p;
@@
msg = "WARNING: Threaded IRQ with no primary handler requested without IRQF_ONESHOT (unless it is nested IRQ)"
coccilib.org.print_todo(p[0],msg)
@script:python depends on report@
p << match.p;
@@
msg = "WARNING: Threaded IRQ with no primary handler requested without IRQF_ONESHOT (unless it is nested IRQ)"
coccilib.report.print_report(p[0],msg)
@@ -0,0 +1,222 @@
// SPDX-License-Identifier: GPL-2.0-only
///
/// Check for opencoded min(), max() implementations.
/// Generated patches sometimes require adding a cast to fix compile warning.
/// Warnings/patches scope intentionally limited to a function body.
///
// Confidence: Medium
// Copyright: (C) 2021 Denis Efremov ISPRAS
// Options: --no-includes --include-headers
//
// Keywords: min, max
//
virtual report
virtual org
virtual context
virtual patch
@rmax depends on !patch@
identifier func;
expression x, y;
binary operator cmp = {>, >=};
position p;
@@
func(...)
{
<...
* ((x) cmp@p (y) ? (x) : (y))
...>
}
@rmaxif depends on !patch@
identifier func;
expression x, y;
expression max_val;
binary operator cmp = {>, >=};
position p;
@@
func(...)
{
<...
* if ((x) cmp@p (y)) {
* max_val = (x);
* } else {
* max_val = (y);
* }
...>
}
// Ignore errcode returns.
@errcode@
position p;
identifier func;
expression x;
binary operator cmp = {<, <=};
@@
func(...)
{
<...
return ((x) cmp@p 0 ? (x) : 0);
...>
}
@rmin depends on !patch@
identifier func;
expression x, y;
binary operator cmp = {<, <=};
position p != errcode.p;
@@
func(...)
{
<...
* ((x) cmp@p (y) ? (x) : (y))
...>
}
@rminif depends on !patch@
identifier func;
expression x, y;
expression min_val;
binary operator cmp = {<, <=};
position p;
@@
func(...)
{
<...
* if ((x) cmp@p (y)) {
* min_val = (x);
* } else {
* min_val = (y);
* }
...>
}
@pmax depends on patch@
identifier func;
expression x, y;
binary operator cmp = {>=, >};
@@
func(...)
{
<...
- ((x) cmp (y) ? (x) : (y))
+ max(x, y)
...>
}
@pmaxif depends on patch@
identifier func;
expression x, y;
expression max_val;
binary operator cmp = {>=, >};
@@
func(...)
{
<...
- if ((x) cmp (y)) {
- max_val = x;
- } else {
- max_val = y;
- }
+ max_val = max(x, y);
...>
}
@pmin depends on patch@
identifier func;
expression x, y;
binary operator cmp = {<=, <};
position p != errcode.p;
@@
func(...)
{
<...
- ((x) cmp@p (y) ? (x) : (y))
+ min(x, y)
...>
}
@pminif depends on patch@
identifier func;
expression x, y;
expression min_val;
binary operator cmp = {<=, <};
@@
func(...)
{
<...
- if ((x) cmp (y)) {
- min_val = x;
- } else {
- min_val = y;
- }
+ min_val = min(x, y);
...>
}
@script:python depends on report@
p << rmax.p;
@@
for p0 in p:
coccilib.report.print_report(p0, "WARNING opportunity for max()")
@script:python depends on org@
p << rmax.p;
@@
for p0 in p:
coccilib.org.print_todo(p0, "WARNING opportunity for max()")
@script:python depends on report@
p << rmaxif.p;
@@
for p0 in p:
coccilib.report.print_report(p0, "WARNING opportunity for max()")
@script:python depends on org@
p << rmaxif.p;
@@
for p0 in p:
coccilib.org.print_todo(p0, "WARNING opportunity for max()")
@script:python depends on report@
p << rmin.p;
@@
for p0 in p:
coccilib.report.print_report(p0, "WARNING opportunity for min()")
@script:python depends on org@
p << rmin.p;
@@
for p0 in p:
coccilib.org.print_todo(p0, "WARNING opportunity for min()")
@script:python depends on report@
p << rminif.p;
@@
for p0 in p:
coccilib.report.print_report(p0, "WARNING opportunity for min()")
@script:python depends on org@
p << rminif.p;
@@
for p0 in p:
coccilib.org.print_todo(p0, "WARNING opportunity for min()")
@@ -0,0 +1,78 @@
// SPDX-License-Identifier: GPL-2.0-only
///
/// Catch strings ending in newline with (GE)NL_SET_ERR_MSG*.
///
// Confidence: Very High
// Copyright: (C) 2020 Intel Corporation
// URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: --no-includes --include-headers
virtual context
virtual org
virtual report
@r depends on context || org || report@
expression e;
constant m;
position p;
@@
\(GENL_SET_ERR_MSG\|GENL_SET_ERR_MSG_FMT\|NL_SET_ERR_MSG\|NL_SET_ERR_MSG_MOD\|
NL_SET_ERR_MSG_FMT\|NL_SET_ERR_MSG_FMT_MOD\|NL_SET_ERR_MSG_WEAK\|
NL_SET_ERR_MSG_WEAK_MOD\|NL_SET_ERR_MSG_ATTR_POL\|
NL_SET_ERR_MSG_ATTR_POL_FMT\|NL_SET_ERR_MSG_ATTR\|
NL_SET_ERR_MSG_ATTR_FMT\)(e,m@p,...)
@script:python@
m << r.m;
@@
if not m.endswith("\\n\""):
cocci.include_match(False)
@r1 depends on r@
identifier fname;
expression r.e;
constant r.m;
position r.p;
@@
fname(e,m@p,...)
//----------------------------------------------------------
// For context mode
//----------------------------------------------------------
@depends on context && r@
identifier r1.fname;
expression r.e;
constant r.m;
@@
* fname(e,m,...)
//----------------------------------------------------------
// For org mode
//----------------------------------------------------------
@script:python depends on org@
fname << r1.fname;
m << r.m;
p << r.p;
@@
if m.endswith("\\n\""):
msg="WARNING avoid newline at end of message in %s" % (fname)
msg_safe=msg.replace("[","@(").replace("]",")")
coccilib.org.print_todo(p[0], msg_safe)
//----------------------------------------------------------
// For report mode
//----------------------------------------------------------
@script:python depends on report@
fname << r1.fname;
m << r.m;
p << r.p;
@@
if m.endswith("\\n\""):
msg="WARNING avoid newline at end of message in %s" % (fname)
coccilib.report.print_report(p[0], msg)
@@ -0,0 +1,82 @@
// SPDX-License-Identifier: GPL-2.0-only
/// sizeof when applied to a pointer typed expression gives the size of
/// the pointer
///
// Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
// URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments:
// Options: --no-includes --include-headers
virtual org
virtual report
virtual context
virtual patch
@depends on patch@
expression *x;
expression f;
expression i;
type T;
@@
(
x = <+... sizeof(
- x
+ *x
) ...+>
|
f(...,(T)(x),...,sizeof(
- x
+ *x
),...)
|
f(...,sizeof(
- x
+ *x
),...,(T)(x),...)
|
f(...,(T)(x),...,i*sizeof(
- x
+ *x
),...)
|
f(...,i*sizeof(
- x
+ *x
),...,(T)(x),...)
)
@r depends on !patch@
expression *x;
expression f;
expression i;
position p;
type T;
@@
(
*x = <+... sizeof@p(x) ...+>
|
*f(...,(T)(x),...,sizeof@p(x),...)
|
*f(...,sizeof@p(x),...,(T)(x),...)
|
*f(...,(T)(x),...,i*sizeof@p(x),...)
|
*f(...,i*sizeof@p(x),...,(T)(x),...)
)
@script:python depends on org@
p << r.p;
@@
cocci.print_main("application of sizeof to pointer",p)
@script:python depends on report@
p << r.p;
@@
msg = "ERROR: application of sizeof to pointer"
coccilib.report.print_report(p[0],msg)
@@ -0,0 +1,86 @@
// SPDX-License-Identifier: GPL-2.0
/// Make sure (of/i2c/platform/spi)_device_id tables are NULL terminated
//
// Keywords: of_table i2c_table platform_table
// Confidence: Medium
// Options: --include-headers
virtual patch
virtual context
virtual org
virtual report
@depends on context@
identifier var, arr;
expression E;
@@
(
struct \(of_device_id \| i2c_device_id \| platform_device_id \| spi_device_id\) arr[] = {
...,
{
.var = E,
* }
};
|
struct \(of_device_id \| i2c_device_id \| platform_device_id \| spi_device_id\) arr[] = {
...,
* { ..., E, ... },
};
)
@depends on patch@
identifier var, arr;
expression E;
@@
(
struct \(of_device_id \| i2c_device_id \| platform_device_id \| spi_device_id\) arr[] = {
...,
{
.var = E,
- }
+ },
+ { }
};
|
struct \(of_device_id \| i2c_device_id \| platform_device_id \| spi_device_id\) arr[] = {
...,
{ ..., E, ... },
+ { },
};
)
@r depends on org || report@
position p1;
identifier var, arr;
expression E;
@@
(
struct \(of_device_id \| i2c_device_id \| platform_device_id \| spi_device_id\) arr[] = {
...,
{
.var = E,
}
@p1
};
|
struct \(of_device_id \| i2c_device_id \| platform_device_id \| spi_device_id\) arr[] = {
...,
{ ..., E, ... }
@p1
};
)
@script:python depends on org@
p1 << r.p1;
arr << r.arr;
@@
cocci.print_main(arr,p1)
@script:python depends on report@
p1 << r.p1;
arr << r.arr;
@@
msg = "%s is not NULL terminated at line %s" % (arr, p1[0].line)
coccilib.report.print_report(p1[0],msg)
@@ -0,0 +1,71 @@
// SPDX-License-Identifier: GPL-2.0-only
/// Check for constants that are added but are used elsewhere as bitmasks
/// The results should be checked manually to ensure that the nonzero
/// bits in the two constants are actually disjoint.
///
// Confidence: Moderate
// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2013 Gilles Muller, INRIA/LIP6.
// URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments:
// Options: --no-includes --include-headers
virtual org
virtual report
virtual context
@r@
constant c,c1;
identifier i,i1;
position p;
@@
(
c1 + c - 1
|
c1@i1 +@p c@i
)
@s@
constant r.c, r.c1;
identifier i;
expression e;
@@
(
e | c@i
|
e & c@i
|
e |= c@i
|
e &= c@i
|
e | c1@i
|
e & c1@i
|
e |= c1@i
|
e &= c1@i
)
@depends on s@
position r.p;
constant c1,c2;
@@
* c1 +@p c2
@script:python depends on s && org@
p << r.p;
@@
cocci.print_main("sum of probable bitmasks, consider |",p)
@script:python depends on s && report@
p << r.p;
@@
msg = "WARNING: sum of probable bitmasks, consider |"
coccilib.report.print_report(p[0],msg)
@@ -0,0 +1,34 @@
// SPDX-License-Identifier: GPL-2.0-only
/// Use %pe format specifier instead of PTR_ERR() for printing error pointers.
///
/// For printing error pointers (i.e., a pointer for which IS_ERR() is true)
/// %pe will print a symbolic error name (e.g., -EINVAL), opposed to the raw
/// errno (e.g., -22) produced by PTR_ERR().
/// It also makes the code cleaner by saving a redundant call to PTR_ERR().
///
// Confidence: High
// Copyright: (C) 2025 NVIDIA CORPORATION & AFFILIATES.
// URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: --no-includes --include-headers
virtual context
virtual org
virtual report
@r@
expression ptr;
constant fmt;
position p;
identifier print_func;
@@
* print_func(..., fmt, ..., PTR_ERR@p(ptr), ...)
@script:python depends on r && report@
p << r.p;
@@
coccilib.report.print_report(p[0], "WARNING: Consider using %pe to print PTR_ERR()")
@script:python depends on r && org@
p << r.p;
@@
coccilib.org.print_todo(p[0], "WARNING: Consider using %pe to print PTR_ERR()")
@@ -0,0 +1,67 @@
// SPDX-License-Identifier: GPL-2.0-only
///
/// Remove unneeded variable used to store return value.
///
// Confidence: Moderate
// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6.
// URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: Comments on code can be deleted if near code that is removed.
// "when strict" can be removed to get more hits, but adds false
// positives
// Options: --no-includes --include-headers
virtual patch
virtual report
virtual context
virtual org
@depends on patch@
type T;
constant C;
identifier ret;
@@
- T ret = C;
... when != ret
when strict
return
- ret
+ C
;
@depends on context@
type T;
constant C;
identifier ret;
@@
* T ret = C;
... when != ret
when strict
* return ret;
@r1 depends on report || org@
type T;
constant C;
identifier ret;
position p1, p2;
@@
T ret@p1 = C;
... when != ret
when strict
return ret@p2;
@script:python depends on report@
p1 << r1.p1;
p2 << r1.p2;
C << r1.C;
ret << r1.ret;
@@
coccilib.report.print_report(p1[0], "Unneeded variable: \"" + ret + "\". Return \"" + C + "\" on line " + p2[0].line)
@script:python depends on org@
p1 << r1.p1;
p2 << r1.p2;
C << r1.C;
ret << r1.ret;
@@
cocci.print_main("unneeded \"" + ret + "\" variable", p1)
cocci.print_sec("return " + C + " here", p2)
@@ -0,0 +1,71 @@
// SPDX-License-Identifier: GPL-2.0-only
///
/// Find usages of:
/// - msecs_to_jiffies(value*1000)
/// - msecs_to_jiffies(value*MSEC_PER_SEC)
///
// Confidence: High
// Copyright: (C) 2024 Easwar Hariharan, Microsoft
// Keywords: secs, seconds, jiffies
// Options: --include-headers
virtual patch
virtual report
virtual context
@pconst depends on patch@ constant C; @@
- msecs_to_jiffies(C * 1000)
+ secs_to_jiffies(C)
@pconstms depends on patch@ constant C; @@
- msecs_to_jiffies(C * MSEC_PER_SEC)
+ secs_to_jiffies(C)
@pexpr depends on patch@ expression E; @@
- msecs_to_jiffies(E * 1000)
+ secs_to_jiffies(E)
@pexprms depends on patch@ expression E; @@
- msecs_to_jiffies(E * MSEC_PER_SEC)
+ secs_to_jiffies(E)
@r depends on report && !patch@
constant C;
expression E;
position p;
@@
(
msecs_to_jiffies(C@p * 1000)
|
msecs_to_jiffies(C@p * MSEC_PER_SEC)
|
msecs_to_jiffies(E@p * 1000)
|
msecs_to_jiffies(E@p * MSEC_PER_SEC)
)
@c depends on context && !patch@
constant C;
expression E;
@@
(
* msecs_to_jiffies(C * 1000)
|
* msecs_to_jiffies(C * MSEC_PER_SEC)
|
* msecs_to_jiffies(E * 1000)
|
* msecs_to_jiffies(E * MSEC_PER_SEC)
)
@script:python depends on report@
p << r.p;
@@
coccilib.report.print_report(p[0], "WARNING opportunity for secs_to_jiffies()")
@@ -0,0 +1,84 @@
// SPDX-License-Identifier: GPL-2.0-only
///
/// Remove unneeded semicolon.
///
// Confidence: Moderate
// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6.
// URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: Some false positives on empty default cases in switch statements.
// Options: --no-includes --include-headers
virtual patch
virtual report
virtual context
virtual org
@r_default@
position p;
@@
switch (...)
{
default: ...;@p
}
@r_case@
position p;
@@
(
switch (...)
{
case ...:;@p
}
|
switch (...)
{
case ...:...
case ...:;@p
}
|
switch (...)
{
case ...:...
case ...:
case ...:;@p
}
)
@r1@
statement S;
position p1;
position p != {r_default.p, r_case.p};
identifier label;
@@
(
label:;
|
S@p1;@p
)
@script:python@
p << r1.p;
p1 << r1.p1;
@@
if p[0].line != p1[0].line_end:
cocci.include_match(False)
@depends on patch@
position r1.p;
@@
-;@p
@script:python depends on report@
p << r1.p;
@@
coccilib.report.print_report(p[0],"Unneeded semicolon")
@depends on context@
position r1.p;
@@
*;@p
@script:python depends on org@
p << r1.p;
@@
cocci.print_main("Unneeded semicolon",p)
@@ -0,0 +1,74 @@
// SPDX-License-Identifier: GPL-2.0-only
///
/// Check for code that could use struct_size().
///
// Confidence: Medium
// Author: Jacob Keller <jacob.e.keller@intel.com>
// Copyright: (C) 2023 Intel Corporation
// Options: --no-includes --include-headers
virtual patch
virtual context
virtual org
virtual report
// the overflow Kunit tests have some code which intentionally does not use
// the macros, so we want to ignore this code when reporting potential
// issues.
@overflow_tests@
identifier f = overflow_size_helpers_test;
@@
f
//----------------------------------------------------------
// For context mode
//----------------------------------------------------------
@depends on !overflow_tests && context@
expression E1, E2;
identifier m;
@@
(
* (sizeof(*E1) + (E2 * sizeof(*E1->m)))
)
//----------------------------------------------------------
// For patch mode
//----------------------------------------------------------
@depends on !overflow_tests && patch@
expression E1, E2;
identifier m;
@@
(
- (sizeof(*E1) + (E2 * sizeof(*E1->m)))
+ struct_size(E1, m, E2)
)
//----------------------------------------------------------
// For org and report mode
//----------------------------------------------------------
@r depends on !overflow_tests && (org || report)@
expression E1, E2;
identifier m;
position p;
@@
(
(sizeof(*E1)@p + (E2 * sizeof(*E1->m)))
)
@script:python depends on org@
p << r.p;
@@
coccilib.org.print_todo(p[0], "WARNING should use struct_size")
@script:python depends on report@
p << r.p;
@@
msg="WARNING: Use struct_size"
coccilib.report.print_report(p[0], msg)
@@ -0,0 +1,122 @@
// SPDX-License-Identifier: GPL-2.0-only
///
/// Check for opencoded swap() implementation.
///
// Confidence: High
// Copyright: (C) 2021 Denis Efremov ISPRAS
// Options: --no-includes --include-headers
//
// Keywords: swap
//
virtual patch
virtual org
virtual report
virtual context
@rvar depends on !patch@
identifier tmp;
expression a, b;
type T;
position p;
@@
(
* T tmp;
|
* T tmp = 0;
|
* T *tmp = NULL;
)
... when != tmp
* tmp = a;
* a = b;@p
* b = tmp;
... when != tmp
@r depends on !patch@
identifier tmp;
expression a, b;
position p != rvar.p;
@@
* tmp = a;
* a = b;@p
* b = tmp;
@rpvar depends on patch@
identifier tmp;
expression a, b;
type T;
@@
(
- T tmp;
|
- T tmp = 0;
|
- T *tmp = NULL;
)
... when != tmp
- tmp = a;
- a = b;
- b = tmp
+ swap(a, b)
;
... when != tmp
@rp depends on patch@
identifier tmp;
expression a, b;
@@
- tmp = a;
- a = b;
- b = tmp
+ swap(a, b)
;
@depends on patch && (rpvar || rp)@
@@
(
for (...;...;...)
- {
swap(...);
- }
|
while (...)
- {
swap(...);
- }
|
if (...)
- {
swap(...);
- }
)
@script:python depends on report@
p << r.p;
@@
coccilib.report.print_report(p[0], "WARNING opportunity for swap()")
@script:python depends on org@
p << r.p;
@@
coccilib.org.print_todo(p[0], "WARNING opportunity for swap()")
@script:python depends on report@
p << rvar.p;
@@
coccilib.report.print_report(p[0], "WARNING opportunity for swap()")
@script:python depends on org@
p << rvar.p;
@@
coccilib.org.print_todo(p[0], "WARNING opportunity for swap()")
@@ -0,0 +1,33 @@
// SPDX-License-Identifier: GPL-2.0-only
/// The address of a variable or field is likely always to be non-zero.
///
// Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
// URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments:
// Options: --no-includes --include-headers
virtual org
virtual report
virtual context
@r@
expression x;
position p;
@@
*\(&x@p == NULL \| &x@p != NULL\)
@script:python depends on org@
p << r.p;
@@
cocci.print_main("test of a variable/field address",p)
@script:python depends on report@
p << r.p;
@@
msg = "ERROR: test of a variable/field address"
coccilib.report.print_report(p[0],msg)
@@ -0,0 +1,56 @@
// SPDX-License-Identifier: GPL-2.0-only
///
/// Please, don't reintroduce uninitialized_var().
///
/// From Documentation/process/deprecated.rst,
/// commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()"):
/// For any compiler warnings about uninitialized variables, just add
/// an initializer. Using warning-silencing tricks is dangerous as it
/// papers over real bugs (or can in the future), and suppresses unrelated
/// compiler warnings (e.g. "unused variable"). If the compiler thinks it
/// is uninitialized, either simply initialize the variable or make compiler
/// changes. Keep in mind that in most cases, if an initialization is
/// obviously redundant, the compiler's dead-store elimination pass will make
/// sure there are no needless variable writes.
///
/// Later, commit 3942ea7a10c9 ("deprecated.rst: Remove now removed
/// uninitialized_var") removed this section because all initializations of
/// this kind were cleaned-up from the kernel. This cocci rule checks that
/// the macro is not explicitly or implicitly reintroduced.
///
// Confidence: High
// Copyright: (C) 2020 Denis Efremov ISPRAS
// Options: --no-includes --include-headers
//
virtual context
virtual report
virtual org
@r@
identifier var;
type T;
position p;
@@
(
* T var =@p var;
|
* T var =@p *(&(var));
|
* var =@p var
|
* var =@p *(&(var))
)
@script:python depends on report@
p << r.p;
@@
coccilib.report.print_report(p[0], "WARNING this kind of initialization is deprecated")
@script:python depends on org@
p << r.p;
@@
coccilib.org.print_todo(p[0], "WARNING this kind of initialization is deprecated")
@@ -0,0 +1,110 @@
// SPDX-License-Identifier: GPL-2.0-only
/// Use WARN(1,...) rather than printk followed by WARN_ON(1)
///
// Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
// URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments:
// Options: --no-includes --include-headers
virtual patch
virtual context
virtual org
virtual report
@bad1@
position p;
@@
printk(...);
printk@p(...);
WARN_ON(1);
@r1 depends on context || report || org@
position p != bad1.p;
@@
printk@p(...);
*WARN_ON(1);
@script:python depends on org@
p << r1.p;
@@
cocci.print_main("printk + WARN_ON can be just WARN",p)
@script:python depends on report@
p << r1.p;
@@
msg = "SUGGESTION: printk + WARN_ON can be just WARN"
coccilib.report.print_report(p[0],msg)
@ok1 depends on patch@
expression list es;
position p != bad1.p;
@@
-printk@p(
+WARN(1,
es);
-WARN_ON(1);
@depends on patch@
expression list ok1.es;
@@
if (...)
- {
WARN(1,es);
- }
// --------------------------------------------------------------------
@bad2@
position p;
@@
printk(...);
printk@p(...);
WARN_ON_ONCE(1);
@r2 depends on context || report || org@
position p != bad1.p;
@@
printk@p(...);
*WARN_ON_ONCE(1);
@script:python depends on org@
p << r2.p;
@@
cocci.print_main("printk + WARN_ON_ONCE can be just WARN_ONCE",p)
@script:python depends on report@
p << r2.p;
@@
msg = "SUGGESTION: printk + WARN_ON_ONCE can be just WARN_ONCE"
coccilib.report.print_report(p[0],msg)
@ok2 depends on patch@
expression list es;
position p != bad2.p;
@@
-printk@p(
+WARN_ONCE(1,
es);
-WARN_ON_ONCE(1);
@depends on patch@
expression list ok2.es;
@@
if (...)
- {
WARN_ONCE(1,es);
- }