1 1.13 rillig /* $NetBSD: msg_193.c,v 1.13 2021/08/15 21:21:13 rillig Exp $ */ 2 1.1 rillig # 3 "msg_193.c" 3 1.1 rillig 4 1.1 rillig // Test for message: statement not reached [193] 5 1.1 rillig 6 1.3 rillig /* 7 1.3 rillig * Test the reachability of statements in a function. 8 1.3 rillig * 9 1.3 rillig * if 10 1.3 rillig * if-else 11 1.3 rillig * if-else-if-else 12 1.3 rillig * for 13 1.3 rillig * while 14 1.3 rillig * do-while 15 1.3 rillig * switch 16 1.3 rillig * break 17 1.3 rillig * continue 18 1.3 rillig * goto 19 1.3 rillig * return 20 1.3 rillig * 21 1.3 rillig * constant expression 22 1.3 rillig * system-dependent constant expression 23 1.3 rillig */ 24 1.3 rillig 25 1.10 rillig extern void reachable(void); 26 1.10 rillig extern void unreachable(void); 27 1.10 rillig extern _Bool maybe(void); 28 1.10 rillig 29 1.3 rillig 30 1.3 rillig void 31 1.3 rillig test_statement(void) 32 1.3 rillig { 33 1.3 rillig reachable(); 34 1.3 rillig reachable(); 35 1.3 rillig } 36 1.3 rillig 37 1.3 rillig void 38 1.3 rillig test_compound_statement(void) 39 1.3 rillig { 40 1.3 rillig reachable(); 41 1.3 rillig { 42 1.3 rillig reachable(); 43 1.3 rillig reachable(); 44 1.3 rillig } 45 1.3 rillig reachable(); 46 1.3 rillig } 47 1.3 rillig 48 1.3 rillig void 49 1.3 rillig test_if_statement(void) 50 1.3 rillig { 51 1.3 rillig if (1) 52 1.3 rillig reachable(); 53 1.3 rillig reachable(); 54 1.3 rillig if (0) 55 1.4 rillig unreachable(); /* expect: 193 */ 56 1.3 rillig reachable(); 57 1.3 rillig } 58 1.3 rillig 59 1.3 rillig void 60 1.3 rillig test_if_compound_statement(void) 61 1.3 rillig { 62 1.3 rillig if (1) { 63 1.3 rillig reachable(); 64 1.3 rillig } 65 1.3 rillig if (1) { 66 1.3 rillig { 67 1.3 rillig { 68 1.3 rillig reachable(); 69 1.3 rillig } 70 1.3 rillig } 71 1.3 rillig } 72 1.3 rillig 73 1.3 rillig if (0) { 74 1.4 rillig unreachable(); /* expect: 193 */ 75 1.3 rillig } 76 1.3 rillig if (0) { 77 1.3 rillig { 78 1.3 rillig { 79 1.4 rillig unreachable(); /* expect: 193 */ 80 1.3 rillig } 81 1.3 rillig } 82 1.3 rillig } 83 1.3 rillig } 84 1.3 rillig 85 1.3 rillig void 86 1.3 rillig test_if_without_else(void) 87 1.3 rillig { 88 1.3 rillig if (1) 89 1.3 rillig reachable(); 90 1.3 rillig reachable(); 91 1.3 rillig 92 1.3 rillig if (0) 93 1.4 rillig unreachable(); /* expect: 193 */ 94 1.3 rillig reachable(); 95 1.3 rillig } 96 1.3 rillig 97 1.3 rillig void 98 1.3 rillig test_if_with_else(void) 99 1.3 rillig { 100 1.3 rillig if (1) 101 1.3 rillig reachable(); 102 1.3 rillig else 103 1.4 rillig unreachable(); /* expect: 193 */ 104 1.3 rillig reachable(); 105 1.3 rillig 106 1.3 rillig if (0) 107 1.4 rillig unreachable(); /* expect: 193 */ 108 1.3 rillig else 109 1.3 rillig reachable(); 110 1.3 rillig reachable(); 111 1.3 rillig } 112 1.3 rillig 113 1.3 rillig void 114 1.3 rillig test_if_else_if_else(void) 115 1.3 rillig { 116 1.3 rillig if (1) 117 1.3 rillig reachable(); 118 1.4 rillig else if (1) /* expect: 193 */ 119 1.4 rillig unreachable(); 120 1.3 rillig else 121 1.4 rillig unreachable(); /* expect: 193 */ 122 1.3 rillig 123 1.3 rillig if (0) 124 1.4 rillig unreachable(); /* expect: 193 */ 125 1.3 rillig else if (1) 126 1.3 rillig reachable(); 127 1.3 rillig else 128 1.4 rillig unreachable(); /* expect: 193 */ 129 1.3 rillig 130 1.3 rillig if (0) 131 1.4 rillig unreachable(); /* expect: 193 */ 132 1.3 rillig else if (0) 133 1.4 rillig unreachable(); /* expect: 193 */ 134 1.3 rillig else 135 1.3 rillig reachable(); 136 1.3 rillig } 137 1.3 rillig 138 1.3 rillig void 139 1.3 rillig test_if_return(void) 140 1.3 rillig { 141 1.3 rillig if (1) 142 1.3 rillig return; 143 1.5 rillig unreachable(); /* expect: 193 */ 144 1.3 rillig } 145 1.3 rillig 146 1.3 rillig void 147 1.3 rillig test_if_else_return(void) 148 1.3 rillig { 149 1.3 rillig if (1) 150 1.3 rillig reachable(); 151 1.3 rillig else 152 1.4 rillig return; /* expect: 193 */ 153 1.3 rillig reachable(); 154 1.3 rillig } 155 1.3 rillig 156 1.3 rillig void 157 1.3 rillig test_for_forever(void) 158 1.3 rillig { 159 1.3 rillig for (;;) 160 1.3 rillig reachable(); 161 1.3 rillig unreachable(); /* expect: 193 */ 162 1.3 rillig } 163 1.3 rillig 164 1.3 rillig void 165 1.3 rillig test_for_true(void) 166 1.3 rillig { 167 1.3 rillig for (; 1;) 168 1.3 rillig reachable(); 169 1.3 rillig unreachable(); /* expect: 193 */ 170 1.3 rillig } 171 1.3 rillig 172 1.3 rillig void 173 1.3 rillig test_for_false(void) 174 1.3 rillig { 175 1.3 rillig for (; 0;) 176 1.6 rillig unreachable(); /* expect: 193 */ 177 1.3 rillig reachable(); 178 1.3 rillig } 179 1.3 rillig 180 1.3 rillig void 181 1.3 rillig test_for_break(void) 182 1.3 rillig { 183 1.3 rillig for (;;) { 184 1.3 rillig reachable(); 185 1.3 rillig break; 186 1.3 rillig unreachable(); /* expect: 193 */ 187 1.3 rillig } 188 1.3 rillig reachable(); 189 1.3 rillig } 190 1.3 rillig 191 1.3 rillig void 192 1.3 rillig test_for_if_break(void) 193 1.3 rillig { 194 1.3 rillig for (;;) { 195 1.3 rillig reachable(); 196 1.3 rillig if (0) { 197 1.4 rillig unreachable(); /* expect: 193 */ 198 1.3 rillig break; 199 1.3 rillig unreachable(); /* expect: 193 */ 200 1.3 rillig } 201 1.3 rillig if (1) { 202 1.3 rillig reachable(); 203 1.3 rillig break; 204 1.3 rillig unreachable(); /* expect: 193 */ 205 1.3 rillig } 206 1.8 rillig unreachable(); /* expect: 193 */ 207 1.3 rillig } 208 1.3 rillig reachable(); 209 1.3 rillig } 210 1.3 rillig 211 1.3 rillig void 212 1.3 rillig test_for_continue(void) 213 1.3 rillig { 214 1.3 rillig for (;;) { 215 1.3 rillig reachable(); 216 1.3 rillig continue; 217 1.3 rillig unreachable(); /* expect: 193 */ 218 1.3 rillig } 219 1.3 rillig unreachable(); /* expect: 193 */ 220 1.3 rillig } 221 1.3 rillig 222 1.3 rillig void 223 1.3 rillig test_for_if_continue(void) 224 1.3 rillig { 225 1.3 rillig for (;;) { 226 1.3 rillig reachable(); 227 1.3 rillig if (0) { 228 1.4 rillig unreachable(); /* expect: 193 */ 229 1.3 rillig continue; 230 1.3 rillig unreachable(); /* expect: 193 */ 231 1.3 rillig } 232 1.3 rillig if (1) { 233 1.3 rillig reachable(); 234 1.3 rillig continue; 235 1.3 rillig unreachable(); /* expect: 193 */ 236 1.3 rillig } 237 1.8 rillig unreachable(); /* expect: 193 */ 238 1.3 rillig } 239 1.3 rillig unreachable(); /* expect: 193 */ 240 1.3 rillig } 241 1.3 rillig 242 1.3 rillig void 243 1.3 rillig test_for_return(void) 244 1.2 rillig { 245 1.3 rillig for (;;) { 246 1.3 rillig reachable(); 247 1.3 rillig return; 248 1.3 rillig unreachable(); /* expect: 193 */ 249 1.3 rillig } 250 1.3 rillig unreachable(); /* expect: 193 */ 251 1.2 rillig } 252 1.3 rillig 253 1.3 rillig void 254 1.3 rillig test_for_if_return(void) 255 1.3 rillig { 256 1.3 rillig for (;;) { 257 1.3 rillig reachable(); 258 1.3 rillig if (0) { 259 1.4 rillig unreachable(); /* expect: 193 */ 260 1.3 rillig return; 261 1.3 rillig unreachable(); /* expect: 193 */ 262 1.3 rillig } 263 1.3 rillig if (1) { 264 1.3 rillig reachable(); 265 1.3 rillig return; 266 1.3 rillig unreachable(); /* expect: 193 */ 267 1.3 rillig } 268 1.8 rillig unreachable(); /* expect: 193 */ 269 1.3 rillig } 270 1.3 rillig unreachable(); /* expect: 193 */ 271 1.3 rillig } 272 1.3 rillig 273 1.3 rillig void 274 1.3 rillig test_while_true(void) 275 1.3 rillig { 276 1.3 rillig while (1) 277 1.3 rillig reachable(); 278 1.3 rillig unreachable(); /* expect: 193 */ 279 1.3 rillig } 280 1.3 rillig 281 1.3 rillig void 282 1.3 rillig test_while_false(void) 283 1.3 rillig { 284 1.3 rillig while (0) 285 1.7 rillig unreachable(); /* expect: 193 */ 286 1.3 rillig reachable(); 287 1.3 rillig } 288 1.3 rillig 289 1.3 rillig void 290 1.3 rillig test_while_break(void) 291 1.3 rillig { 292 1.3 rillig while (1) { 293 1.3 rillig reachable(); 294 1.3 rillig break; 295 1.3 rillig unreachable(); /* expect: 193 */ 296 1.3 rillig } 297 1.3 rillig reachable(); 298 1.3 rillig } 299 1.3 rillig 300 1.3 rillig void 301 1.3 rillig test_while_if_break(void) 302 1.3 rillig { 303 1.3 rillig while (1) { 304 1.3 rillig reachable(); 305 1.3 rillig if (0) { 306 1.4 rillig unreachable(); /* expect: 193 */ 307 1.3 rillig break; 308 1.3 rillig unreachable(); /* expect: 193 */ 309 1.3 rillig } 310 1.3 rillig if (1) { 311 1.3 rillig reachable(); 312 1.3 rillig break; 313 1.3 rillig unreachable(); /* expect: 193 */ 314 1.3 rillig } 315 1.8 rillig unreachable(); /* expect: 193 */ 316 1.3 rillig } 317 1.3 rillig reachable(); 318 1.3 rillig } 319 1.3 rillig 320 1.3 rillig void 321 1.3 rillig test_while_continue(void) 322 1.3 rillig { 323 1.3 rillig while (1) { 324 1.3 rillig reachable(); 325 1.3 rillig continue; 326 1.3 rillig unreachable(); /* expect: 193 */ 327 1.3 rillig } 328 1.3 rillig unreachable(); /* expect: 193 */ 329 1.3 rillig } 330 1.3 rillig 331 1.3 rillig void 332 1.3 rillig test_while_if_continue(void) 333 1.3 rillig { 334 1.3 rillig while (1) { 335 1.3 rillig reachable(); 336 1.3 rillig if (0) { 337 1.4 rillig unreachable(); /* expect: 193 */ 338 1.3 rillig continue; 339 1.3 rillig unreachable(); /* expect: 193 */ 340 1.3 rillig } 341 1.3 rillig if (1) { 342 1.3 rillig reachable(); 343 1.3 rillig continue; 344 1.3 rillig unreachable(); /* expect: 193 */ 345 1.3 rillig } 346 1.8 rillig unreachable(); /* expect: 193 */ 347 1.3 rillig } 348 1.3 rillig unreachable(); /* expect: 193 */ 349 1.3 rillig } 350 1.3 rillig 351 1.3 rillig void 352 1.3 rillig test_while_return(void) 353 1.3 rillig { 354 1.3 rillig while (1) { 355 1.3 rillig reachable(); 356 1.3 rillig return; 357 1.3 rillig unreachable(); /* expect: 193 */ 358 1.3 rillig } 359 1.3 rillig unreachable(); /* expect: 193 */ 360 1.3 rillig } 361 1.3 rillig 362 1.3 rillig void 363 1.3 rillig test_while_if_return(void) 364 1.3 rillig { 365 1.3 rillig while (1) { 366 1.3 rillig reachable(); 367 1.3 rillig if (0) { 368 1.4 rillig unreachable(); /* expect: 193 */ 369 1.3 rillig return; 370 1.3 rillig unreachable(); /* expect: 193 */ 371 1.3 rillig } 372 1.3 rillig if (1) { 373 1.3 rillig reachable(); 374 1.3 rillig return; 375 1.3 rillig unreachable(); /* expect: 193 */ 376 1.3 rillig } 377 1.8 rillig unreachable(); /* expect: 193 */ 378 1.3 rillig } 379 1.3 rillig unreachable(); /* expect: 193 */ 380 1.3 rillig } 381 1.3 rillig 382 1.3 rillig void 383 1.3 rillig test_do_while_true(void) 384 1.3 rillig { 385 1.3 rillig do { 386 1.3 rillig reachable(); 387 1.3 rillig } while (1); 388 1.3 rillig unreachable(); /* expect: 193 */ 389 1.3 rillig } 390 1.3 rillig 391 1.3 rillig void 392 1.3 rillig test_do_while_false(void) 393 1.3 rillig { 394 1.3 rillig do { 395 1.3 rillig reachable(); 396 1.3 rillig } while (0); 397 1.3 rillig reachable(); 398 1.3 rillig } 399 1.3 rillig 400 1.3 rillig void 401 1.3 rillig test_do_while_break(void) 402 1.3 rillig { 403 1.3 rillig do { 404 1.3 rillig reachable(); 405 1.3 rillig break; 406 1.3 rillig unreachable(); /* expect: 193 */ 407 1.3 rillig } while (1); 408 1.3 rillig reachable(); 409 1.3 rillig } 410 1.3 rillig 411 1.3 rillig void 412 1.3 rillig test_do_while_if_break(void) 413 1.3 rillig { 414 1.3 rillig do { 415 1.3 rillig reachable(); 416 1.3 rillig if (0) { 417 1.4 rillig unreachable(); /* expect: 193 */ 418 1.3 rillig break; 419 1.3 rillig unreachable(); /* expect: 193 */ 420 1.3 rillig } 421 1.3 rillig if (1) { 422 1.3 rillig reachable(); 423 1.3 rillig break; 424 1.3 rillig unreachable(); /* expect: 193 */ 425 1.3 rillig } 426 1.8 rillig unreachable(); /* expect: 193 */ 427 1.3 rillig } while (1); 428 1.3 rillig reachable(); 429 1.3 rillig } 430 1.3 rillig 431 1.3 rillig void 432 1.3 rillig test_do_while_continue(void) 433 1.3 rillig { 434 1.3 rillig do { 435 1.3 rillig reachable(); 436 1.3 rillig continue; 437 1.3 rillig unreachable(); /* expect: 193 */ 438 1.3 rillig } while (1); 439 1.3 rillig unreachable(); /* expect: 193 */ 440 1.3 rillig } 441 1.3 rillig 442 1.3 rillig void 443 1.3 rillig test_do_while_if_continue(void) 444 1.3 rillig { 445 1.3 rillig do { 446 1.3 rillig reachable(); 447 1.3 rillig if (0) { 448 1.4 rillig unreachable(); /* expect: 193 */ 449 1.3 rillig continue; 450 1.3 rillig unreachable(); /* expect: 193 */ 451 1.3 rillig } 452 1.3 rillig if (1) { 453 1.3 rillig reachable(); 454 1.3 rillig continue; 455 1.3 rillig unreachable(); /* expect: 193 */ 456 1.3 rillig } 457 1.8 rillig unreachable(); /* expect: 193 */ 458 1.3 rillig } while (1); 459 1.3 rillig unreachable(); /* expect: 193 */ 460 1.3 rillig } 461 1.3 rillig 462 1.3 rillig void 463 1.3 rillig test_do_while_return(void) 464 1.3 rillig { 465 1.3 rillig do { 466 1.3 rillig reachable(); 467 1.3 rillig return; 468 1.3 rillig unreachable(); /* expect: 193 */ 469 1.3 rillig } while (1); 470 1.3 rillig unreachable(); /* expect: 193 */ 471 1.3 rillig } 472 1.3 rillig 473 1.3 rillig void 474 1.3 rillig test_do_while_if_return(void) 475 1.3 rillig { 476 1.3 rillig do { 477 1.3 rillig reachable(); 478 1.3 rillig if (0) { 479 1.4 rillig unreachable(); /* expect: 193 */ 480 1.3 rillig return; 481 1.3 rillig unreachable(); /* expect: 193 */ 482 1.3 rillig } 483 1.3 rillig if (1) { 484 1.3 rillig reachable(); 485 1.3 rillig return; 486 1.3 rillig unreachable(); /* expect: 193 */ 487 1.3 rillig } 488 1.8 rillig unreachable(); /* expect: 193 */ 489 1.3 rillig } while (1); 490 1.3 rillig unreachable(); /* expect: 193 */ 491 1.3 rillig } 492 1.3 rillig 493 1.9 rillig void 494 1.9 rillig test_if_nested(void) 495 1.9 rillig { 496 1.9 rillig if (0) { 497 1.9 rillig if (1) /* expect: 193 */ 498 1.9 rillig unreachable(); 499 1.9 rillig else 500 1.9 rillig unreachable(); /* expect: 193 *//* XXX: redundant */ 501 1.9 rillig 502 1.9 rillig if (0) 503 1.9 rillig unreachable(); /* expect: 193 *//* XXX: redundant */ 504 1.9 rillig else 505 1.9 rillig unreachable(); 506 1.9 rillig 507 1.9 rillig unreachable(); 508 1.9 rillig } 509 1.9 rillig reachable(); 510 1.9 rillig 511 1.9 rillig if (1) { 512 1.9 rillig if (1) 513 1.9 rillig reachable(); 514 1.9 rillig else 515 1.9 rillig unreachable(); /* expect: 193 */ 516 1.9 rillig 517 1.9 rillig if (0) 518 1.9 rillig unreachable(); /* expect: 193 */ 519 1.9 rillig else 520 1.9 rillig reachable(); 521 1.9 rillig 522 1.9 rillig reachable(); 523 1.9 rillig } 524 1.9 rillig reachable(); 525 1.9 rillig } 526 1.9 rillig 527 1.10 rillig void 528 1.10 rillig test_if_maybe(void) 529 1.10 rillig { 530 1.10 rillig if (maybe()) { 531 1.10 rillig if (0) 532 1.10 rillig unreachable(); /* expect: 193 */ 533 1.10 rillig else 534 1.10 rillig reachable(); 535 1.10 rillig reachable(); 536 1.10 rillig } 537 1.10 rillig reachable(); 538 1.10 rillig 539 1.10 rillig if (0) { 540 1.10 rillig if (maybe()) /* expect: 193 */ 541 1.10 rillig unreachable(); 542 1.10 rillig else 543 1.10 rillig unreachable(); 544 1.10 rillig unreachable(); 545 1.10 rillig } 546 1.10 rillig reachable(); 547 1.10 rillig 548 1.10 rillig if (1) { 549 1.10 rillig if (maybe()) 550 1.10 rillig reachable(); 551 1.10 rillig else 552 1.10 rillig reachable(); 553 1.10 rillig reachable(); 554 1.10 rillig } 555 1.10 rillig reachable(); 556 1.10 rillig } 557 1.10 rillig 558 1.11 rillig /* 559 1.11 rillig * To compute the reachability graph of this little monster, lint would have 560 1.11 rillig * to keep all statements and their relations from the whole function in 561 1.11 rillig * memory. It doesn't do that. Therefore it does not warn about any 562 1.11 rillig * unreachable statements in this function. 563 1.11 rillig */ 564 1.11 rillig void 565 1.11 rillig test_goto_numbers_alphabetically(void) 566 1.11 rillig { 567 1.11 rillig goto one; 568 1.11 rillig eight: 569 1.11 rillig goto nine; 570 1.11 rillig five: 571 1.11 rillig return; 572 1.11 rillig four: 573 1.11 rillig goto five; 574 1.11 rillig nine: 575 1.11 rillig goto ten; 576 1.11 rillig one: 577 1.11 rillig goto two; 578 1.11 rillig seven: 579 1.11 rillig goto eight; 580 1.12 rillig six: /* expect: warning: label 'six' unused */ 581 1.11 rillig goto seven; 582 1.11 rillig ten: 583 1.11 rillig return; 584 1.11 rillig three: 585 1.11 rillig goto four; 586 1.11 rillig two: 587 1.11 rillig goto three; 588 1.11 rillig } 589 1.11 rillig 590 1.11 rillig void 591 1.11 rillig test_while_goto(void) 592 1.11 rillig { 593 1.11 rillig while (1) { 594 1.11 rillig goto out; 595 1.11 rillig break; /* lint only warns with the -b option */ 596 1.11 rillig } 597 1.11 rillig unreachable(); /* expect: 193 */ 598 1.11 rillig out: 599 1.11 rillig reachable(); 600 1.11 rillig } 601 1.11 rillig 602 1.11 rillig void 603 1.11 rillig test_unreachable_label(void) 604 1.11 rillig { 605 1.11 rillig if (0) 606 1.11 rillig goto unreachable; /* expect: 193 */ 607 1.11 rillig goto reachable; 608 1.11 rillig 609 1.11 rillig /* named_label assumes that any label is reachable. */ 610 1.11 rillig unreachable: 611 1.11 rillig unreachable(); 612 1.11 rillig reachable: 613 1.11 rillig reachable(); 614 1.11 rillig } 615 1.11 rillig 616 1.3 rillig /* TODO: switch */ 617 1.3 rillig 618 1.3 rillig /* TODO: system-dependent constant expression (see tn_system_dependent) */ 619 1.13 rillig 620 1.13 rillig void suppressed(void); 621 1.13 rillig 622 1.13 rillig void 623 1.13 rillig lint_annotation_NOTREACHED(void) 624 1.13 rillig { 625 1.13 rillig if (0) { 626 1.13 rillig /* expect+1: warning: statement not reached [193] */ 627 1.13 rillig unreachable(); 628 1.13 rillig } 629 1.13 rillig 630 1.13 rillig if (0) { 631 1.13 rillig /* NOTREACHED */ 632 1.13 rillig suppressed(); 633 1.13 rillig } 634 1.13 rillig 635 1.13 rillig if (0) 636 1.13 rillig /* NOTREACHED */ 637 1.13 rillig suppressed(); 638 1.13 rillig 639 1.13 rillig if (1) { 640 1.13 rillig reachable(); 641 1.13 rillig } 642 1.13 rillig 643 1.13 rillig if (1) { 644 1.13 rillig /* NOTREACHED */ 645 1.13 rillig suppressed(); 646 1.13 rillig } 647 1.13 rillig 648 1.13 rillig /* FIXME: The 'if' statement _is_ reached. */ 649 1.13 rillig /* expect+1: warning: statement not reached [193] */ 650 1.13 rillig if (1) 651 1.13 rillig /* NOTREACHED */ 652 1.13 rillig suppressed(); 653 1.13 rillig } 654