flexible_array.cocci (1821B)
1// SPDX-License-Identifier: GPL-2.0-only 2/// 3/// Zero-length and one-element arrays are deprecated, see 4/// Documentation/process/deprecated.rst 5/// Flexible-array members should be used instead. 6/// 7// 8// Confidence: High 9// Copyright: (C) 2020 Denis Efremov ISPRAS. 10// Comments: 11// Options: --no-includes --include-headers 12 13virtual context 14virtual report 15virtual org 16virtual patch 17 18@initialize:python@ 19@@ 20def relevant(positions): 21 for p in positions: 22 if "uapi" in p.file: 23 return False 24 return True 25 26@r depends on !patch@ 27identifier name, array; 28type T; 29position p : script:python() { relevant(p) }; 30@@ 31 32( 33 struct name { 34 ... 35* T array@p[\(0\|1\)]; 36 }; 37| 38 struct { 39 ... 40* T array@p[\(0\|1\)]; 41 }; 42| 43 union name { 44 ... 45* T array@p[\(0\|1\)]; 46 }; 47| 48 union { 49 ... 50* T array@p[\(0\|1\)]; 51 }; 52) 53 54@only_field depends on patch@ 55identifier name, array; 56type T; 57position q; 58@@ 59 60( 61 struct name {@q 62 T array[0]; 63 }; 64| 65 struct {@q 66 T array[0]; 67 }; 68) 69 70@depends on patch@ 71identifier name, array; 72type T; 73position p : script:python() { relevant(p) }; 74// position @q with rule "only_field" simplifies 75// handling of bitfields, arrays, etc. 76position q != only_field.q; 77@@ 78 79( 80 struct name {@q 81 ... 82 T array@p[ 83- 0 84 ]; 85 }; 86| 87 struct {@q 88 ... 89 T array@p[ 90- 0 91 ]; 92 }; 93) 94 95@script: python depends on report@ 96p << r.p; 97@@ 98 99msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)" 100coccilib.report.print_report(p[0], msg) 101 102@script: python depends on org@ 103p << r.p; 104@@ 105 106msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)" 107coccilib.org.print_todo(p[0], msg)