1 #define __cond_lock(c) ((c) ? ({ __context__(1); 1; }) : 0) 2 a(void)3static void a(void) __attribute__((context(0,1))) 4 { 5 __context__(1); 6 } 7 r(void)8static void r(void) __attribute__((context(1,0))) 9 { 10 __context__(-1); 11 } 12 13 extern int _ca(int fail); 14 #define ca(fail) __cond_lock(_ca(fail)) 15 good_paired1(void)16static void good_paired1(void) 17 { 18 a(); 19 r(); 20 } 21 good_paired2(void)22static void good_paired2(void) 23 { 24 a(); 25 r(); 26 a(); 27 r(); 28 } 29 good_paired3(void)30static void good_paired3(void) 31 { 32 a(); 33 a(); 34 r(); 35 r(); 36 } 37 good_lock1(void)38static void good_lock1(void) __attribute__((context(0,1))) 39 { 40 a(); 41 } 42 good_lock2(void)43static void good_lock2(void) __attribute__((context(0,1))) 44 { 45 a(); 46 r(); 47 a(); 48 } 49 good_lock3(void)50static void good_lock3(void) __attribute__((context(0,1))) 51 { 52 a(); 53 a(); 54 r(); 55 } 56 good_unlock1(void)57static void good_unlock1(void) __attribute__((context(1,0))) 58 { 59 r(); 60 } 61 good_unlock2(void)62static void good_unlock2(void) __attribute__((context(1,0))) 63 { 64 a(); 65 r(); 66 r(); 67 } 68 warn_lock1(void)69static void warn_lock1(void) 70 { 71 a(); 72 } 73 warn_lock2(void)74static void warn_lock2(void) 75 { 76 a(); 77 r(); 78 a(); 79 } 80 warn_lock3(void)81static void warn_lock3(void) 82 { 83 a(); 84 a(); 85 r(); 86 } 87 warn_unlock1(void)88static void warn_unlock1(void) 89 { 90 r(); 91 } 92 warn_unlock2(void)93static void warn_unlock2(void) 94 { 95 a(); 96 r(); 97 r(); 98 } 99 100 extern int condition, condition2; 101 good_if1(void)102static int good_if1(void) 103 { 104 a(); 105 if(condition) { 106 r(); 107 return -1; 108 } 109 r(); 110 return 0; 111 } 112 good_if2(void)113static void good_if2(void) 114 { 115 if(condition) { 116 a(); 117 r(); 118 } 119 } 120 good_if3(void)121static void good_if3(void) 122 { 123 a(); 124 if(condition) { 125 a(); 126 r(); 127 } 128 r(); 129 } 130 warn_if1(void)131static int warn_if1(void) 132 { 133 a(); 134 if(condition) 135 return -1; 136 r(); 137 return 0; 138 } 139 warn_if2(void)140static int warn_if2(void) 141 { 142 a(); 143 if(condition) { 144 r(); 145 return -1; 146 } 147 return 0; 148 } 149 good_while1(void)150static void good_while1(void) 151 { 152 a(); 153 while(condition) 154 ; 155 r(); 156 } 157 good_while2(void)158static void good_while2(void) 159 { 160 while(condition) { 161 a(); 162 r(); 163 } 164 } 165 good_while3(void)166static void good_while3(void) 167 { 168 while(condition) { 169 a(); 170 r(); 171 if(condition2) 172 break; 173 a(); 174 r(); 175 } 176 } 177 good_while4(void)178static void good_while4(void) 179 { 180 a(); 181 while(1) { 182 if(condition2) { 183 r(); 184 break; 185 } 186 } 187 } 188 good_while5(void)189static void good_while5(void) 190 { 191 a(); 192 while(1) { 193 r(); 194 if(condition2) 195 break; 196 a(); 197 } 198 } 199 warn_while1(void)200static void warn_while1(void) 201 { 202 while(condition) { 203 a(); 204 } 205 } 206 warn_while2(void)207static void warn_while2(void) 208 { 209 while(condition) { 210 r(); 211 } 212 } 213 warn_while3(void)214static void warn_while3(void) 215 { 216 while(condition) { 217 a(); 218 if(condition2) 219 break; 220 r(); 221 } 222 } 223 good_goto1(void)224static void good_goto1(void) 225 { 226 a(); 227 goto label; 228 label: 229 r(); 230 } 231 good_goto2(void)232static void good_goto2(void) 233 { 234 a(); 235 goto label; 236 a(); 237 r(); 238 label: 239 r(); 240 } 241 good_goto3(void)242static void good_goto3(void) 243 { 244 a(); 245 if(condition) 246 goto label; 247 a(); 248 r(); 249 label: 250 r(); 251 } 252 good_goto4(void)253static void good_goto4(void) 254 { 255 if(condition) 256 goto label; 257 a(); 258 r(); 259 label: 260 ; 261 } 262 good_goto5(void)263static void good_goto5(void) 264 { 265 a(); 266 if(condition) 267 goto label; 268 r(); 269 return; 270 label: 271 r(); 272 } 273 warn_goto1(void)274static void warn_goto1(void) 275 { 276 a(); 277 goto label; 278 r(); 279 label: 280 ; 281 } 282 warn_goto2(void)283static void warn_goto2(void) 284 { 285 a(); 286 goto label; 287 r(); 288 label: 289 a(); 290 r(); 291 } 292 warn_goto3(void)293static void warn_goto3(void) 294 { 295 a(); 296 if(condition) 297 goto label; 298 r(); 299 label: 300 r(); 301 } 302 good_cond_lock1(void)303static void good_cond_lock1(void) 304 { 305 if(ca(condition)) { 306 condition2 = 1; /* do stuff */ 307 r(); 308 } 309 } 310 warn_cond_lock1(void)311static void warn_cond_lock1(void) 312 { 313 if(ca(condition)) 314 condition2 = 1; /* do stuff */ 315 r(); 316 } 317 /* 318 * check-name: Check -Wcontext 319 * 320 * check-error-start 321 context.c:69:13: warning: context imbalance in 'warn_lock1' - wrong count at exit 322 context.c:74:13: warning: context imbalance in 'warn_lock2' - wrong count at exit 323 context.c:81:13: warning: context imbalance in 'warn_lock3' - wrong count at exit 324 context.c:88:13: warning: context imbalance in 'warn_unlock1' - unexpected unlock 325 context.c:93:13: warning: context imbalance in 'warn_unlock2' - unexpected unlock 326 context.c:131:12: warning: context imbalance in 'warn_if1' - wrong count at exit 327 context.c:140:12: warning: context imbalance in 'warn_if2' - different lock contexts for basic block 328 context.c:202:9: warning: context imbalance in 'warn_while1' - different lock contexts for basic block 329 context.c:210:17: warning: context imbalance in 'warn_while2' - unexpected unlock 330 context.c:216:9: warning: context imbalance in 'warn_while3' - wrong count at exit 331 context.c:274:13: warning: context imbalance in 'warn_goto1' - wrong count at exit 332 context.c:283:13: warning: context imbalance in 'warn_goto2' - wrong count at exit 333 context.c:300:5: warning: context imbalance in 'warn_goto3' - different lock contexts for basic block 334 context.c:315:5: warning: context imbalance in 'warn_cond_lock1' - different lock contexts for basic block 335 * check-error-end 336 */ 337