1 // RUN: %check_clang_tidy %s cppcoreguidelines-avoid-non-const-global-variables %t 2 3 int nonConstInt = 0; 4 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: variable 'nonConstInt' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 5 6 int &nonConstIntReference = nonConstInt; 7 // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: variable 'nonConstIntReference' provides global access to a non-const object; consider making the referenced data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 8 9 int *pointerToNonConstInt = &nonConstInt; 10 // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: variable 'pointerToNonConstInt' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 11 // CHECK-MESSAGES: :[[@LINE-2]]:6: warning: variable 'pointerToNonConstInt' provides global access to a non-const object; consider making the pointed-to data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 12 13 int *const constPointerToNonConstInt = &nonConstInt; 14 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: variable 'constPointerToNonConstInt' provides global access to a non-const object; consider making the pointed-to data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 15 16 namespace namespace_name { 17 int nonConstNamespaceInt = 0; 18 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: variable 'nonConstNamespaceInt' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 19 20 const int constNamespaceInt = 0; 21 } // namespace namespace_name 22 23 const int constInt = 0; 24 25 const int *pointerToConstInt = &constInt; 26 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: variable 'pointerToConstInt' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 27 28 const int *const constPointerToConstInt = &constInt; 29 30 const int &constReferenceToConstInt = constInt; 31 32 constexpr int constexprInt = 0; 33 34 int function() { 35 int nonConstReturnValue = 0; 36 return nonConstReturnValue; 37 } 38 39 namespace { 40 int nonConstAnonymousNamespaceInt = 0; 41 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: variable 'nonConstAnonymousNamespaceInt' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 42 } // namespace 43 44 class DummyClass { 45 public: 46 int nonConstPublicMemberVariable = 0; 47 const int constPublicMemberVariable = 0; 48 49 private: 50 int nonConstPrivateMemberVariable = 0; 51 const int constPrivateMemberVariable = 0; 52 }; 53 54 DummyClass nonConstClassInstance; 55 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: variable 'nonConstClassInstance' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 56 57 DummyClass *pointerToNonConstDummyClass = &nonConstClassInstance; 58 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: variable 'pointerToNonConstDummyClass' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 59 // CHECK-MESSAGES: :[[@LINE-2]]:13: warning: variable 'pointerToNonConstDummyClass' provides global access to a non-const object; consider making the pointed-to data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 60 61 DummyClass &referenceToNonConstDummyClass = nonConstClassInstance; 62 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: variable 'referenceToNonConstDummyClass' provides global access to a non-const object; consider making the referenced data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 63 64 int *nonConstPointerToMember = &nonConstClassInstance.nonConstPublicMemberVariable; 65 // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: variable 'nonConstPointerToMember' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 66 // CHECK-MESSAGES: :[[@LINE-2]]:6: warning: variable 'nonConstPointerToMember' provides global access to a non-const object; consider making the pointed-to data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 67 int *const constPointerToNonConstMember = &nonConstClassInstance.nonConstPublicMemberVariable; 68 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: variable 'constPointerToNonConstMember' provides global access to a non-const object; consider making the pointed-to data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 69 70 const DummyClass constClassInstance; 71 72 DummyClass *const constPointerToNonConstDummyClass = &nonConstClassInstance; 73 // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: variable 'constPointerToNonConstDummyClass' provides global access to a non-const object; consider making the pointed-to data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 74 75 const DummyClass *nonConstPointerToConstDummyClass = &constClassInstance; 76 // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: variable 'nonConstPointerToConstDummyClass' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 77 78 const DummyClass *const constPointerToConstDummyClass = &constClassInstance; 79 80 const int *const constPointerToConstMember = &constClassInstance.nonConstPublicMemberVariable; 81 82 const DummyClass &constReferenceToDummyClass = constClassInstance; 83 84 namespace namespace_name { 85 DummyClass nonConstNamespaceClassInstance; 86 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: variable 'nonConstNamespaceClassInstance' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 87 88 const DummyClass constDummyClassInstance; 89 } // namespace namespace_name 90 91 // CHECKING FOR NON-CONST GLOBAL ENUM ///////////////////////////////////////// 92 enum DummyEnum { 93 first, 94 second 95 }; 96 97 DummyEnum nonConstDummyEnumInstance = DummyEnum::first; 98 // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: variable 'nonConstDummyEnumInstance' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 99 100 DummyEnum *pointerToNonConstDummyEnum = &nonConstDummyEnumInstance; 101 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: variable 'pointerToNonConstDummyEnum' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 102 // CHECK-MESSAGES: :[[@LINE-2]]:12: warning: variable 'pointerToNonConstDummyEnum' provides global access to a non-const object; consider making the pointed-to data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 103 104 DummyEnum &referenceToNonConstDummyEnum = nonConstDummyEnumInstance; 105 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: variable 'referenceToNonConstDummyEnum' provides global access to a non-const object; consider making the referenced data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 106 107 DummyEnum *const constPointerToNonConstDummyEnum = &nonConstDummyEnumInstance; 108 // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: variable 'constPointerToNonConstDummyEnum' provides global access to a non-const object; consider making the pointed-to data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 109 110 const DummyEnum constDummyEnumInstance = DummyEnum::first; 111 112 const DummyEnum *nonConstPointerToConstDummyEnum = &constDummyEnumInstance; 113 // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: variable 'nonConstPointerToConstDummyEnum' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 114 115 const DummyEnum *const constPointerToConstDummyEnum = &constDummyEnumInstance; 116 117 const DummyEnum &referenceToConstDummyEnum = constDummyEnumInstance; 118 119 namespace namespace_name { 120 DummyEnum nonConstNamespaceEnumInstance = DummyEnum::first; 121 // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: variable 'nonConstNamespaceEnumInstance' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 122 123 const DummyEnum constNamespaceEnumInstance = DummyEnum::first; 124 } // namespace namespace_name 125 126 namespace { 127 DummyEnum nonConstAnonymousNamespaceEnumInstance = DummyEnum::first; 128 } 129 // CHECK-MESSAGES: :[[@LINE-2]]:11: warning: variable 'nonConstAnonymousNamespaceEnumInstance' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 130 131 // CHECKING FOR NON-CONST GLOBAL STRUCT /////////////////////////////////////// 132 struct DummyStruct { 133 public: 134 int structIntElement = 0; 135 const int constStructIntElement = 0; 136 137 private: 138 int privateStructIntElement = 0; 139 }; 140 141 DummyStruct nonConstDummyStructInstance; 142 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: variable 'nonConstDummyStructInstance' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 143 144 DummyStruct *pointerToNonConstDummyStruct = &nonConstDummyStructInstance; 145 // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: variable 'pointerToNonConstDummyStruct' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 146 // CHECK-MESSAGES: :[[@LINE-2]]:14: warning: variable 'pointerToNonConstDummyStruct' provides global access to a non-const object; consider making the pointed-to data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 147 148 DummyStruct &referenceToNonConstDummyStruct = nonConstDummyStructInstance; 149 // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: variable 'referenceToNonConstDummyStruct' provides global access to a non-const object; consider making the referenced data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 150 DummyStruct *const constPointerToNonConstDummyStruct = &nonConstDummyStructInstance; 151 // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: variable 'constPointerToNonConstDummyStruct' provides global access to a non-const object; consider making the pointed-to data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 152 153 const DummyStruct constDummyStructInstance; 154 155 const DummyStruct *nonConstPointerToConstDummyStruct = &constDummyStructInstance; 156 // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: variable 'nonConstPointerToConstDummyStruct' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 157 158 const DummyStruct *const constPointerToConstDummyStruct = &constDummyStructInstance; 159 160 const DummyStruct &referenceToConstDummyStruct = constDummyStructInstance; 161 162 namespace namespace_name { 163 DummyStruct nonConstNamespaceDummyStructInstance; 164 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: variable 'nonConstNamespaceDummyStructInstance' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 165 166 const DummyStruct constNamespaceDummyStructInstance; 167 } // namespace namespace_name 168 169 namespace { 170 DummyStruct nonConstAnonymousNamespaceStructInstance; 171 } 172 // CHECK-MESSAGES: :[[@LINE-2]]:13: warning: variable 'nonConstAnonymousNamespaceStructInstance' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 173 174 // CHECKING FOR NON-CONST GLOBAL UNION //////////////////////////////////////// 175 union DummyUnion { 176 int unionInteger; 177 char unionChar; 178 }; 179 180 DummyUnion nonConstUnionIntInstance = {0x0}; 181 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: variable 'nonConstUnionIntInstance' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 182 183 DummyUnion *nonConstPointerToNonConstUnionInt = &nonConstUnionIntInstance; 184 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: variable 'nonConstPointerToNonConstUnionInt' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 185 // CHECK-MESSAGES: :[[@LINE-2]]:13: warning: variable 'nonConstPointerToNonConstUnionInt' provides global access to a non-const object; consider making the pointed-to data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 186 187 DummyUnion *const constPointerToNonConstUnionInt = &nonConstUnionIntInstance; 188 // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: variable 'constPointerToNonConstUnionInt' provides global access to a non-const object; consider making the pointed-to data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 189 190 DummyUnion &referenceToNonConstUnionInt = nonConstUnionIntInstance; 191 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: variable 'referenceToNonConstUnionInt' provides global access to a non-const object; consider making the referenced data 'const' [cppcoreguidelines-avoid-non-const-global-variables] 192 193 const DummyUnion constUnionIntInstance = {0x0}; 194 195 const DummyUnion *nonConstPointerToConstUnionInt = &constUnionIntInstance; 196 // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: variable 'nonConstPointerToConstUnionInt' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 197 198 const DummyUnion *const constPointerToConstUnionInt = &constUnionIntInstance; 199 200 const DummyUnion &referenceToConstUnionInt = constUnionIntInstance; 201 202 namespace namespace_name { 203 DummyUnion nonConstNamespaceDummyUnionInstance; 204 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: variable 'nonConstNamespaceDummyUnionInstance' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 205 206 const DummyUnion constNamespaceDummyUnionInstance = {0x0}; 207 } // namespace namespace_name 208 209 namespace { 210 DummyUnion nonConstAnonymousNamespaceUnionInstance = {0x0}; 211 } 212 // CHECK-MESSAGES: :[[@LINE-2]]:12: warning: variable 'nonConstAnonymousNamespaceUnionInstance' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 213 214 // CHECKING FOR NON-CONST GLOBAL FUNCTION POINTER ///////////////////////////// 215 int dummyFunction() { 216 return 0; 217 } 218 219 typedef int (*functionPointer)(); 220 functionPointer fp1 = &dummyFunction; 221 // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: variable 'fp1' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 222 223 typedef int (*const functionConstPointer)(); 224 functionPointer fp2 = &dummyFunction; 225 // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: variable 'fp2' is non-const and globally accessible, consider making it const [cppcoreguidelines-avoid-non-const-global-variables] 226 227 // CHECKING FOR NON-CONST GLOBAL TEMPLATE VARIABLE //////////////////////////// 228 template <class T> 229 constexpr T templateVariable = T(0L); 230 231 // CHECKING AGAINST FALSE POSITIVES INSIDE FUNCTION SCOPE ///////////////////// 232 int main() { 233 for (int i = 0; i < 3; ++i) { 234 static int staticNonConstLoopVariable = 42; 235 int nonConstLoopVariable = 42; 236 nonConstInt = nonConstLoopVariable + i + staticNonConstLoopVariable; 237 } 238 } 239