1// Copyright (c) 2020 Nordic Semiconductor ASA 2// SPDX-License-Identifer: Apache-2.0 3 4// Enforce preservation of const qualifier on config_info casts 5// 6// Drivers cast the device config_info pointer to a driver-specific 7// structure. The object is const-qualified; make sure the cast 8// doesn't inadvertently remove that qualifier. 9// 10// Also add the qualifier to pointer definitions where it's missing. 11// 12// Note that this patch may produce incorrect results if config_info 13// appears as a tag in non-device aggregate types. 14// 15// Options: --include-headers 16 17virtual patch 18virtual report 19 20// bare: (struct T*)E 21@r_cci_bare_patch 22 depends on patch 23 disable optional_qualifier 24@ 25identifier T; 26expression E; 27@@ 28 ( 29+const 30 struct T*)E->config_info 31 32// bare const: (struct T* const)E 33@r_cci_bare_lc_patch 34 depends on patch 35 disable optional_qualifier 36@ 37identifier T; 38expression E; 39@@ 40 ( 41+const 42 struct T * const)E->config_info 43 44// asg: struct T *D = (const struct T*) 45@r_cci_asg_patch 46 depends on patch 47 disable optional_qualifier 48@ 49identifier T; 50identifier D; 51expression E; 52@@ 53+const 54 struct T * D = (const struct T*)E->config_info; 55 56// asg to const local: struct T * const D = (const struct T*) 57@r_cci_lc_asg_patch 58 depends on patch 59 disable optional_qualifier 60@ 61identifier T; 62identifier D; 63expression E; 64@@ 65+const 66 struct T * const D = (const struct T*)E->config_info; 67 68// asg via macro: struct T * D = DEV_CFG() 69@r_cci_asg_macro_patch 70 depends on patch 71 disable optional_qualifier 72@ 73identifier T; 74identifier D; 75expression E; 76@@ 77+const 78 struct T * D = DEV_CFG(E); 79 80// asg via macro to const local: struct T * const D = DEV_CFG() 81@r_cci_lc_asg_macro_patch 82 depends on patch 83 disable optional_qualifier 84@ 85identifier T; 86identifier D; 87expression E; 88@@ 89+const 90 struct T * const D = DEV_CFG(E); 91 92// asg via macro: struct T * D; ... ; D = (const struct T*)CI; 93@r_cci_delayed_asg_patch 94 depends on patch 95 disable optional_qualifier 96@ 97identifier T; 98identifier D; 99expression E; 100@@ 101+const 102 struct T * D; 103 ... 104 D = (const struct T*)E->config_info; 105 106// delayed asg via macro: struct T * D; ... ; D = DEV_CFG(); 107@r_cci_delayed_asg_macro_patch 108 depends on patch 109 disable optional_qualifier 110@ 111identifier T; 112identifier D; 113expression E; 114@@ 115+const 116 struct T * D; 117 ... 118 D = DEV_CFG(E); 119 120@r_cci_report 121 depends on report 122 disable optional_qualifier 123@ 124identifier T; 125expression E; 126position p; 127@@ 128 (struct T*)E->config_info@p 129 130@script:python 131 depends on report 132@ 133t << r_cci_report.T; 134p << r_cci_report.p; 135@@ 136msg = "WARNING: cast of config_info to struct {} requires 'const'".format(t) 137coccilib.report.print_report(p[0], msg) 138