1// SPDX-License-Identifier: GPL-2.0-only
2///
3/// Check for code that could use struct_size().
4///
5// Confidence: Medium
6// Author: Jacob Keller <jacob.e.keller@intel.com>
7// Copyright: (C) 2023 Intel Corporation
8// Options: --no-includes --include-headers
9
10virtual patch
11virtual context
12virtual org
13virtual report
14
15// the overflow Kunit tests have some code which intentionally does not use
16// the macros, so we want to ignore this code when reporting potential
17// issues.
18@overflow_tests@
19identifier f = overflow_size_helpers_test;
20@@
21
22f
23
24//----------------------------------------------------------
25//  For context mode
26//----------------------------------------------------------
27
28@depends on !overflow_tests && context@
29expression E1, E2;
30identifier m;
31@@
32(
33* (sizeof(*E1) + (E2 * sizeof(*E1->m)))
34)
35
36//----------------------------------------------------------
37//  For patch mode
38//----------------------------------------------------------
39
40@depends on !overflow_tests && patch@
41expression E1, E2;
42identifier m;
43@@
44(
45- (sizeof(*E1) + (E2 * sizeof(*E1->m)))
46+ struct_size(E1, m, E2)
47)
48
49//----------------------------------------------------------
50//  For org and report mode
51//----------------------------------------------------------
52
53@r depends on !overflow_tests && (org || report)@
54expression E1, E2;
55identifier m;
56position p;
57@@
58(
59 (sizeof(*E1)@p + (E2 * sizeof(*E1->m)))
60)
61
62@script:python depends on org@
63p << r.p;
64@@
65
66coccilib.org.print_todo(p[0], "WARNING should use struct_size")
67
68@script:python depends on report@
69p << r.p;
70@@
71
72msg="WARNING: Use struct_size"
73coccilib.report.print_report(p[0], msg)
74
75