Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

coccinelle: Check for missing NULL terminators in of_device_id tables

Failure to terminate an of_device_id table can lead to confusing
failures depending on where the compiler places the array. Add a
check to make sure these tables are terminated. Thanks to Mitchel
Humpherys for coming up with the pattern initially.

Cc: Mitchel Humpherys <mitchelh@codeaurora.org>
Cc: Gilles Muller <Gilles.Muller@lip6.fr>
Cc: Nicolas Palix <nicolas.palix@imag.fr>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: devicetree@vger.kernel.org
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Acked-by: Grant Likely <grant.likely@linaro.org>
Signed-off-by: Julia Lawall <julia.lawall@lip6.fr>
Signed-off-by: Michal Marek <mmarek@suse.cz>

authored by

Stephen Boyd and committed by
Michal Marek
2d5c5dbb 9b24a15d

+62
+62
scripts/coccinelle/misc/of_table.cocci
··· 1 + /// Make sure of_device_id tables are NULL terminated 2 + // 3 + // Keywords: of_table 4 + // Confidence: Medium 5 + // Options: --include-headers 6 + 7 + virtual patch 8 + virtual context 9 + virtual org 10 + virtual report 11 + 12 + @depends on context@ 13 + identifier var, arr; 14 + expression E; 15 + @@ 16 + struct of_device_id arr[] = { 17 + ..., 18 + { 19 + .var = E, 20 + * } 21 + }; 22 + 23 + @depends on patch@ 24 + identifier var, arr; 25 + expression E; 26 + @@ 27 + struct of_device_id arr[] = { 28 + ..., 29 + { 30 + .var = E, 31 + - } 32 + + }, 33 + + { } 34 + }; 35 + 36 + @r depends on org || report@ 37 + position p1; 38 + identifier var, arr; 39 + expression E; 40 + @@ 41 + struct of_device_id arr[] = { 42 + ..., 43 + { 44 + .var = E, 45 + } 46 + @p1 47 + }; 48 + 49 + @script:python depends on org@ 50 + p1 << r.p1; 51 + arr << r.arr; 52 + @@ 53 + 54 + cocci.print_main(arr,p1) 55 + 56 + @script:python depends on report@ 57 + p1 << r.p1; 58 + arr << r.arr; 59 + @@ 60 + 61 + msg = "%s is not NULL terminated at line %s" % (arr, p1[0].line) 62 + coccilib.report.print_report(p1[0],msg)