1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core.IdenticalExpr -w -verify %s 2 3 /* Only one expected warning per function allowed at the very end. */ 4 5 int func(void) 6 { 7 return 0; 8 } 9 10 int func2(void) 11 { 12 return 0; 13 } 14 15 int funcParam(int a) 16 { 17 return 0; 18 } 19 20 /* '!=' operator*/ 21 22 /* '!=' with float */ 23 int checkNotEqualFloatLiteralCompare1(void) { 24 return (5.14F != 5.14F); // no warning 25 } 26 27 int checkNotEqualFloatLiteralCompare2(void) { 28 return (6.14F != 7.14F); // no warning 29 } 30 31 int checkNotEqualFloatDeclCompare1(void) { 32 float f = 7.1F; 33 float g = 7.1F; 34 return (f != g); // no warning 35 } 36 37 int checkNotEqualFloatDeclCompare12(void) { 38 float f = 7.1F; 39 return (f != f); // no warning 40 } 41 42 int checkNotEqualFloatDeclCompare3(void) { 43 float f = 7.1F; 44 return (f != 7.1F); // no warning 45 } 46 47 int checkNotEqualFloatDeclCompare4(void) { 48 float f = 7.1F; 49 return (7.1F != f); // no warning 50 } 51 52 int checkNotEqualFloatDeclCompare5(void) { 53 float f = 7.1F; 54 int t = 7; 55 return (t != f); // no warning 56 } 57 58 int checkNotEqualFloatDeclCompare6(void) { 59 float f = 7.1F; 60 int t = 7; 61 return (f != t); // no warning 62 } 63 64 65 66 int checkNotEqualCastFloatDeclCompare11(void) { 67 float f = 7.1F; 68 return ((int)f != (int)f); // expected-warning {{comparison of identical expressions always evaluates to false}} 69 } 70 int checkNotEqualCastFloatDeclCompare12(void) { 71 float f = 7.1F; 72 return ((char)f != (int)f); // no warning 73 } 74 int checkNotEqualBinaryOpFloatCompare1(void) { 75 int res; 76 float f= 3.14F; 77 res = (f + 3.14F != f + 3.14F); // no warning 78 return (0); 79 } 80 int checkNotEqualBinaryOpFloatCompare2(void) { 81 float f = 7.1F; 82 float g = 7.1F; 83 return (f + 3.14F != g + 3.14F); // no warning 84 } 85 int checkNotEqualBinaryOpFloatCompare3(void) { 86 int res; 87 float f= 3.14F; 88 res = ((int)f + 3.14F != (int)f + 3.14F); // no warning 89 return (0); 90 } 91 int checkNotEqualBinaryOpFloatCompare4(void) { 92 int res; 93 float f= 3.14F; 94 res = ((int)f + 3.14F != (char)f + 3.14F); // no warning 95 return (0); 96 } 97 98 int checkNotEqualNestedBinaryOpFloatCompare1(void) { 99 int res; 100 int t= 1; 101 int u= 2; 102 float f= 3.14F; 103 res = (((int)f + (3.14F - u)*t) != ((int)f + (3.14F - u)*t)); // no warning 104 return (0); 105 } 106 107 int checkNotEqualNestedBinaryOpFloatCompare2(void) { 108 int res; 109 int t= 1; 110 int u= 2; 111 float f= 3.14F; 112 res = (((int)f + (u - 3.14F)*t) != ((int)f + (3.14F - u)*t)); // no warning 113 return (0); 114 } 115 116 int checkNotEqualNestedBinaryOpFloatCompare3(void) { 117 int res; 118 int t= 1; 119 int u= 2; 120 float f= 3.14F; 121 res = (((int)f + (u - 3.14F)*t) != ((int)f + (3.14F - u)*(f + t != f + t))); // no warning 122 return (0); 123 } 124 125 126 127 128 /* end '!=' with float*/ 129 130 /* '!=' with int*/ 131 132 int checkNotEqualIntLiteralCompare1(void) { 133 return (5 != 5); // expected-warning {{comparison of identical expressions always evaluates to false}} 134 } 135 136 int checkNotEqualIntLiteralCompare2(void) { 137 return (6 != 7); // no warning 138 } 139 140 int checkNotEqualIntDeclCompare1(void) { 141 int f = 7; 142 int g = 7; 143 return (f != g); // no warning 144 } 145 146 int checkNotEqualIntDeclCompare3(void) { 147 int f = 7; 148 return (f != 7); // no warning 149 } 150 151 int checkNotEqualIntDeclCompare4(void) { 152 int f = 7; 153 return (7 != f); // no warning 154 } 155 156 int checkNotEqualCastIntDeclCompare11(void) { 157 int f = 7; 158 return ((int)f != (int)f); // expected-warning {{comparison of identical expressions always evaluates to false}} 159 } 160 int checkNotEqualCastIntDeclCompare12(void) { 161 int f = 7; 162 return ((char)f != (int)f); // no warning 163 } 164 int checkNotEqualBinaryOpIntCompare1(void) { 165 int res; 166 int t= 1; 167 int u= 2; 168 int f= 4; 169 res = (f + 4 != f + 4); // expected-warning {{comparison of identical expressions always evaluates to false}} 170 return (0); 171 } 172 int checkNotEqualBinaryOpIntCompare2(void) { 173 int f = 7; 174 int g = 7; 175 return (f + 4 != g + 4); // no warning 176 } 177 178 179 int checkNotEqualBinaryOpIntCompare3(void) { 180 int res; 181 int t= 1; 182 int u= 2; 183 int f= 4; 184 res = ((int)f + 4 != (int)f + 4); // expected-warning {{comparison of identical expressions always evaluates to false}} 185 return (0); 186 } 187 int checkNotEqualBinaryOpIntCompare4(void) { 188 int res; 189 int t= 1; 190 int u= 2; 191 int f= 4; 192 res = ((int)f + 4 != (char)f + 4); // no warning 193 return (0); 194 } 195 int checkNotEqualBinaryOpIntCompare5(void) { 196 int res; 197 int t= 1; 198 int u= 2; 199 res = (u + t != u + t); // expected-warning {{comparison of identical expressions always evaluates to false}} 200 return (0); 201 } 202 203 int checkNotEqualNestedBinaryOpIntCompare1(void) { 204 int res; 205 int t= 1; 206 int u= 2; 207 int f= 3; 208 res = (((int)f + (3 - u)*t) != ((int)f + (3 - u)*t)); // expected-warning {{comparison of identical expressions always evaluates to false}} 209 return (0); 210 } 211 212 int checkNotEqualNestedBinaryOpIntCompare2(void) { 213 int res; 214 int t= 1; 215 int u= 2; 216 int f= 3; 217 res = (((int)f + (u - 3)*t) != ((int)f + (3 - u)*t)); // no warning 218 return (0); 219 } 220 221 int checkNotEqualNestedBinaryOpIntCompare3(void) { 222 int res; 223 int t= 1; 224 int u= 2; 225 int f= 3; 226 res = (((int)f + (u - 3)*t) != ((int)f + (3 - u)*(t + 1 != t + 1))); // expected-warning {{comparison of identical expressions always evaluates to false}} 227 return (0); 228 } 229 230 /* end '!=' int */ 231 232 233 234 /* '!=' with int pointer */ 235 236 int checkNotEqualIntPointerLiteralCompare1(void) { 237 int* p = 0; 238 return (p != 0); // no warning 239 } 240 241 int checkNotEqualIntPointerLiteralCompare2(void) { 242 return (6 != 7); // no warning 243 } 244 245 int checkNotEqualIntPointerDeclCompare1(void) { 246 int k = 3; 247 int* f = &k; 248 int* g = &k; 249 return (f != g); // no warning 250 } 251 252 int checkNotEqualCastIntPointerDeclCompare11(void) { 253 int k = 7; 254 int* f = &k; 255 return ((int*)f != (int*)f); // expected-warning {{comparison of identical expressions always evaluates to false}} 256 } 257 int checkNotEqualCastIntPointerDeclCompare12(void) { 258 int k = 7; 259 int* f = &k; 260 return ((int*)((char*)f) != (int*)f); // no warning 261 } 262 int checkNotEqualBinaryOpIntPointerCompare1(void) { 263 int k = 7; 264 int res; 265 int* f= &k; 266 res = (f + 4 != f + 4); // expected-warning {{comparison of identical expressions always evaluates to false}} 267 return (0); 268 } 269 int checkNotEqualBinaryOpIntPointerCompare2(void) { 270 int k = 7; 271 int* f = &k; 272 int* g = &k; 273 return (f + 4 != g + 4); // no warning 274 } 275 276 277 int checkNotEqualBinaryOpIntPointerCompare3(void) { 278 int k = 7; 279 int res; 280 int* f= &k; 281 res = ((int*)f + 4 != (int*)f + 4); // expected-warning {{comparison of identical expressions always evaluates to false}} 282 return (0); 283 } 284 int checkNotEqualBinaryOpIntPointerCompare4(void) { 285 int k = 7; 286 int res; 287 int* f= &k; 288 res = ((int*)f + 4 != (int*)((char*)f) + 4); // no warning 289 return (0); 290 } 291 292 int checkNotEqualNestedBinaryOpIntPointerCompare1(void) { 293 int res; 294 int k = 7; 295 int t= 1; 296 int* u= &k+2; 297 int* f= &k+3; 298 res = ((f + (3)*t) != (f + (3)*t)); // expected-warning {{comparison of identical expressions always evaluates to false}} 299 return (0); 300 } 301 302 int checkNotEqualNestedBinaryOpIntPointerCompare2(void) { 303 int res; 304 int k = 7; 305 int t= 1; 306 int* u= &k+2; 307 int* f= &k+3; 308 res = (((3)*t + f) != (f + (3)*t)); // no warning 309 return (0); 310 } 311 /* end '!=' int* */ 312 313 /* '!=' with function*/ 314 315 int checkNotEqualSameFunction() { 316 unsigned a = 0; 317 unsigned b = 1; 318 int res = (a+func() != a+func()); // no warning 319 return (0); 320 } 321 322 int checkNotEqualDifferentFunction() { 323 unsigned a = 0; 324 unsigned b = 1; 325 int res = (a+func() != a+func2()); // no warning 326 return (0); 327 } 328 329 int checkNotEqualSameFunctionSameParam() { 330 unsigned a = 0; 331 unsigned b = 1; 332 int res = (a+funcParam(a) != a+funcParam(a)); // no warning 333 return (0); 334 } 335 336 int checkNotEqualSameFunctionDifferentParam() { 337 unsigned a = 0; 338 unsigned b = 1; 339 int res = (a+funcParam(a) != a+funcParam(b)); // no warning 340 return (0); 341 } 342 343 /* end '!=' with function*/ 344 345 /* end '!=' */ 346 347 348 349 /* EQ operator */ 350 351 int checkEqualIntPointerDeclCompare(void) { 352 int k = 3; 353 int* f = &k; 354 int* g = &k; 355 return (f == g); // no warning 356 } 357 358 int checkEqualIntPointerDeclCompare0(void) { 359 int k = 3; 360 int* f = &k; 361 return (f+1 == f+1); // expected-warning {{comparison of identical expressions always evaluates to true}} 362 } 363 364 /* EQ with float*/ 365 366 int checkEqualFloatLiteralCompare1(void) { 367 return (5.14F == 5.14F); // no warning 368 } 369 370 int checkEqualFloatLiteralCompare2(void) { 371 return (6.14F == 7.14F); // no warning 372 } 373 374 int checkEqualFloatDeclCompare1(void) { 375 float f = 7.1F; 376 float g = 7.1F; 377 return (f == g); // no warning 378 } 379 380 int checkEqualFloatDeclCompare12(void) { 381 float f = 7.1F; 382 return (f == f); // no warning 383 } 384 385 386 int checkEqualFloatDeclCompare3(void) { 387 float f = 7.1F; 388 return (f == 7.1F); // no warning 389 } 390 391 int checkEqualFloatDeclCompare4(void) { 392 float f = 7.1F; 393 return (7.1F == f); // no warning 394 } 395 396 int checkEqualFloatDeclCompare5(void) { 397 float f = 7.1F; 398 int t = 7; 399 return (t == f); // no warning 400 } 401 402 int checkEqualFloatDeclCompare6(void) { 403 float f = 7.1F; 404 int t = 7; 405 return (f == t); // no warning 406 } 407 408 409 410 411 int checkEqualCastFloatDeclCompare11(void) { 412 float f = 7.1F; 413 return ((int)f == (int)f); // expected-warning {{comparison of identical expressions always evaluates to true}} 414 } 415 int checkEqualCastFloatDeclCompare12(void) { 416 float f = 7.1F; 417 return ((char)f == (int)f); // no warning 418 } 419 int checkEqualBinaryOpFloatCompare1(void) { 420 int res; 421 float f= 3.14F; 422 res = (f + 3.14F == f + 3.14F); // no warning 423 return (0); 424 } 425 int checkEqualBinaryOpFloatCompare2(void) { 426 float f = 7.1F; 427 float g = 7.1F; 428 return (f + 3.14F == g + 3.14F); // no warning 429 } 430 int checkEqualBinaryOpFloatCompare3(void) { 431 int res; 432 float f= 3.14F; 433 res = ((int)f + 3.14F == (int)f + 3.14F); // no warning 434 return (0); 435 } 436 int checkEqualBinaryOpFloatCompare4(void) { 437 int res; 438 float f= 3.14F; 439 res = ((int)f + 3.14F == (char)f + 3.14F); // no warning 440 return (0); 441 } 442 443 int checkEqualNestedBinaryOpFloatCompare1(void) { 444 int res; 445 int t= 1; 446 int u= 2; 447 float f= 3.14F; 448 res = (((int)f + (3.14F - u)*t) == ((int)f + (3.14F - u)*t)); // no warning 449 return (0); 450 } 451 452 int checkEqualNestedBinaryOpFloatCompare2(void) { 453 int res; 454 int t= 1; 455 int u= 2; 456 float f= 3.14F; 457 res = (((int)f + (u - 3.14F)*t) == ((int)f + (3.14F - u)*t)); // no warning 458 return (0); 459 } 460 461 int checkEqualNestedBinaryOpFloatCompare3(void) { 462 int res; 463 int t= 1; 464 int u= 2; 465 float f= 3.14F; 466 res = (((int)f + (u - 3.14F)*t) == ((int)f + (3.14F - u)*(f + t == f + t))); // no warning 467 return (0); 468 } 469 470 471 472 473 474 /* Equal with int*/ 475 476 int checkEqualIntLiteralCompare1(void) { 477 return (5 == 5); // expected-warning {{comparison of identical expressions always evaluates to true}} 478 } 479 480 int checkEqualIntLiteralCompare2(void) { 481 return (6 == 7); // no warning 482 } 483 484 int checkEqualIntDeclCompare1(void) { 485 int f = 7; 486 int g = 7; 487 return (f == g); // no warning 488 } 489 490 int checkEqualCastIntDeclCompare11(void) { 491 int f = 7; 492 return ((int)f == (int)f); // expected-warning {{comparison of identical expressions always evaluates to true}} 493 } 494 int checkEqualCastIntDeclCompare12(void) { 495 int f = 7; 496 return ((char)f == (int)f); // no warning 497 } 498 499 int checkEqualIntDeclCompare3(void) { 500 int f = 7; 501 return (f == 7); // no warning 502 } 503 504 int checkEqualIntDeclCompare4(void) { 505 int f = 7; 506 return (7 == f); // no warning 507 } 508 509 int checkEqualBinaryOpIntCompare1(void) { 510 int res; 511 int t= 1; 512 int u= 2; 513 int f= 4; 514 res = (f + 4 == f + 4); // expected-warning {{comparison of identical expressions always evaluates to true}} 515 return (0); 516 } 517 int checkEqualBinaryOpIntCompare2(void) { 518 int f = 7; 519 int g = 7; 520 return (f + 4 == g + 4); // no warning 521 } 522 523 524 int checkEqualBinaryOpIntCompare3(void) { 525 int res; 526 int t= 1; 527 int u= 2; 528 int f= 4; 529 res = ((int)f + 4 == (int)f + 4); // expected-warning {{comparison of identical expressions always evaluates to true}} 530 return (0); 531 532 } 533 int checkEqualBinaryOpIntCompare4(void) { 534 int res; 535 int t= 1; 536 int u= 2; 537 int f= 4; 538 res = ((int)f + 4 == (char)f + 4); // no warning 539 return (0); 540 } 541 int checkEqualBinaryOpIntCompare5(void) { 542 int res; 543 int t= 1; 544 int u= 2; 545 res = (u + t == u + t); // expected-warning {{comparison of identical expressions always evaluates to true}} 546 return (0); 547 } 548 549 int checkEqualNestedBinaryOpIntCompare1(void) { 550 int res; 551 int t= 1; 552 int u= 2; 553 int f= 3; 554 res = (((int)f + (3 - u)*t) == ((int)f + (3 - u)*t)); // expected-warning {{comparison of identical expressions always evaluates to true}} 555 return (0); 556 } 557 558 int checkEqualNestedBinaryOpIntCompare2(void) { 559 int res; 560 int t= 1; 561 int u= 2; 562 int f= 3; 563 res = (((int)f + (u - 3)*t) == ((int)f + (3 - u)*t)); // no warning 564 return (0); 565 } 566 567 int checkEqualNestedBinaryOpIntCompare3(void) { 568 int res; 569 int t= 1; 570 int u= 2; 571 int f= 3; 572 res = (((int)f + (u - 3)*t) == ((int)f + (3 - u)*(t + 1 == t + 1))); // expected-warning {{comparison of identical expressions always evaluates to true}} 573 return (0); 574 } 575 576 /* '==' with function*/ 577 578 int checkEqualSameFunction() { 579 unsigned a = 0; 580 unsigned b = 1; 581 int res = (a+func() == a+func()); // no warning 582 return (0); 583 } 584 585 int checkEqualDifferentFunction() { 586 unsigned a = 0; 587 unsigned b = 1; 588 int res = (a+func() == a+func2()); // no warning 589 return (0); 590 } 591 592 int checkEqualSameFunctionSameParam() { 593 unsigned a = 0; 594 unsigned b = 1; 595 int res = (a+funcParam(a) == a+funcParam(a)); // no warning 596 return (0); 597 } 598 599 int checkEqualSameFunctionDifferentParam() { 600 unsigned a = 0; 601 unsigned b = 1; 602 int res = (a+funcParam(a) == a+funcParam(b)); // no warning 603 return (0); 604 } 605 606 /* end '==' with function*/ 607 608 /* end EQ int */ 609 610 /* end EQ */ 611 612 613 /* LT */ 614 615 /* LT with float */ 616 617 int checkLessThanFloatLiteralCompare1(void) { 618 return (5.14F < 5.14F); // expected-warning {{comparison of identical expressions always evaluates to false}} 619 } 620 621 int checkLessThanFloatLiteralCompare2(void) { 622 return (6.14F < 7.14F); // no warning 623 } 624 625 int checkLessThanFloatDeclCompare1(void) { 626 float f = 7.1F; 627 float g = 7.1F; 628 return (f < g); // no warning 629 } 630 631 int checkLessThanFloatDeclCompare12(void) { 632 float f = 7.1F; 633 return (f < f); // expected-warning {{comparison of identical expressions always evaluates to false}} 634 } 635 636 int checkLessThanFloatDeclCompare3(void) { 637 float f = 7.1F; 638 return (f < 7.1F); // no warning 639 } 640 641 int checkLessThanFloatDeclCompare4(void) { 642 float f = 7.1F; 643 return (7.1F < f); // no warning 644 } 645 646 int checkLessThanFloatDeclCompare5(void) { 647 float f = 7.1F; 648 int t = 7; 649 return (t < f); // no warning 650 } 651 652 int checkLessThanFloatDeclCompare6(void) { 653 float f = 7.1F; 654 int t = 7; 655 return (f < t); // no warning 656 } 657 658 659 int checkLessThanCastFloatDeclCompare11(void) { 660 float f = 7.1F; 661 return ((int)f < (int)f); // expected-warning {{comparison of identical expressions always evaluates to false}} 662 } 663 int checkLessThanCastFloatDeclCompare12(void) { 664 float f = 7.1F; 665 return ((char)f < (int)f); // no warning 666 } 667 int checkLessThanBinaryOpFloatCompare1(void) { 668 int res; 669 float f= 3.14F; 670 res = (f + 3.14F < f + 3.14F); // no warning 671 return (0); 672 } 673 int checkLessThanBinaryOpFloatCompare2(void) { 674 float f = 7.1F; 675 float g = 7.1F; 676 return (f + 3.14F < g + 3.14F); // no warning 677 } 678 int checkLessThanBinaryOpFloatCompare3(void) { 679 int res; 680 float f= 3.14F; 681 res = ((int)f + 3.14F < (int)f + 3.14F); // no warning 682 return (0); 683 } 684 int checkLessThanBinaryOpFloatCompare4(void) { 685 int res; 686 float f= 3.14F; 687 res = ((int)f + 3.14F < (char)f + 3.14F); // no warning 688 return (0); 689 } 690 691 int checkLessThanNestedBinaryOpFloatCompare1(void) { 692 int res; 693 int t= 1; 694 int u= 2; 695 float f= 3.14F; 696 res = (((int)f + (3.14F - u)*t) < ((int)f + (3.14F - u)*t)); // no warning 697 return (0); 698 } 699 700 int checkLessThanNestedBinaryOpFloatCompare2(void) { 701 int res; 702 int t= 1; 703 int u= 2; 704 float f= 3.14F; 705 res = (((int)f + (u - 3.14F)*t) < ((int)f + (3.14F - u)*t)); // no warning 706 return (0); 707 } 708 709 int checkLessThanNestedBinaryOpFloatCompare3(void) { 710 int res; 711 int t= 1; 712 int u= 2; 713 float f= 3.14F; 714 res = (((int)f + (u - 3.14F)*t) < ((int)f + (3.14F - u)*(f + t < f + t))); // no warning 715 return (0); 716 } 717 718 /* end LT with float */ 719 720 /* LT with int */ 721 722 723 int checkLessThanIntLiteralCompare1(void) { 724 return (5 < 5); // expected-warning {{comparison of identical expressions always evaluates to false}} 725 } 726 727 int checkLessThanIntLiteralCompare2(void) { 728 return (6 < 7); // no warning 729 } 730 731 int checkLessThanIntDeclCompare1(void) { 732 int f = 7; 733 int g = 7; 734 return (f < g); // no warning 735 } 736 737 int checkLessThanIntDeclCompare3(void) { 738 int f = 7; 739 return (f < 7); // no warning 740 } 741 742 int checkLessThanIntDeclCompare4(void) { 743 int f = 7; 744 return (7 < f); // no warning 745 } 746 747 int checkLessThanIntDeclCompare5(void) { 748 int f = 7; 749 int t = 7; 750 return (t < f); // no warning 751 } 752 753 int checkLessThanIntDeclCompare6(void) { 754 int f = 7; 755 int t = 7; 756 return (f < t); // no warning 757 } 758 759 int checkLessThanCastIntDeclCompare11(void) { 760 int f = 7; 761 return ((int)f < (int)f); // expected-warning {{comparison of identical expressions always evaluates to false}} 762 } 763 int checkLessThanCastIntDeclCompare12(void) { 764 int f = 7; 765 return ((char)f < (int)f); // no warning 766 } 767 int checkLessThanBinaryOpIntCompare1(void) { 768 int res; 769 int f= 3; 770 res = (f + 3 < f + 3); // expected-warning {{comparison of identical expressions always evaluates to false}} 771 return (0); 772 } 773 int checkLessThanBinaryOpIntCompare2(void) { 774 int f = 7; 775 int g = 7; 776 return (f + 3 < g + 3); // no warning 777 } 778 int checkLessThanBinaryOpIntCompare3(void) { 779 int res; 780 int f= 3; 781 res = ((int)f + 3 < (int)f + 3); // expected-warning {{comparison of identical expressions always evaluates to false}} 782 return (0); 783 } 784 int checkLessThanBinaryOpIntCompare4(void) { 785 int res; 786 int f= 3; 787 res = ((int)f + 3 < (char)f + 3); // no warning 788 return (0); 789 } 790 791 int checkLessThanNestedBinaryOpIntCompare1(void) { 792 int res; 793 int t= 1; 794 int u= 2; 795 int f= 3; 796 res = (((int)f + (3 - u)*t) < ((int)f + (3 - u)*t)); // expected-warning {{comparison of identical expressions always evaluates to false}} 797 return (0); 798 } 799 800 int checkLessThanNestedBinaryOpIntCompare2(void) { 801 int res; 802 int t= 1; 803 int u= 2; 804 int f= 3; 805 res = (((int)f + (u - 3)*t) < ((int)f + (3 - u)*t)); // no warning 806 return (0); 807 } 808 809 int checkLessThanNestedBinaryOpIntCompare3(void) { 810 int res; 811 int t= 1; 812 int u= 2; 813 int f= 3; 814 res = (((int)f + (u - 3)*t) < ((int)f + (3 - u)*(t + u < t + u))); // expected-warning {{comparison of identical expressions always evaluates to false}} 815 return (0); 816 } 817 818 /* end LT with int */ 819 820 /* end LT */ 821 822 823 /* GT */ 824 825 /* GT with float */ 826 827 int checkGreaterThanFloatLiteralCompare1(void) { 828 return (5.14F > 5.14F); // expected-warning {{comparison of identical expressions always evaluates to false}} 829 } 830 831 int checkGreaterThanFloatLiteralCompare2(void) { 832 return (6.14F > 7.14F); // no warning 833 } 834 835 int checkGreaterThanFloatDeclCompare1(void) { 836 float f = 7.1F; 837 float g = 7.1F; 838 839 return (f > g); // no warning 840 } 841 842 int checkGreaterThanFloatDeclCompare12(void) { 843 float f = 7.1F; 844 return (f > f); // expected-warning {{comparison of identical expressions always evaluates to false}} 845 } 846 847 848 int checkGreaterThanFloatDeclCompare3(void) { 849 float f = 7.1F; 850 return (f > 7.1F); // no warning 851 } 852 853 int checkGreaterThanFloatDeclCompare4(void) { 854 float f = 7.1F; 855 return (7.1F > f); // no warning 856 } 857 858 int checkGreaterThanFloatDeclCompare5(void) { 859 float f = 7.1F; 860 int t = 7; 861 return (t > f); // no warning 862 } 863 864 int checkGreaterThanFloatDeclCompare6(void) { 865 float f = 7.1F; 866 int t = 7; 867 return (f > t); // no warning 868 } 869 870 int checkGreaterThanCastFloatDeclCompare11(void) { 871 float f = 7.1F; 872 return ((int)f > (int)f); // expected-warning {{comparison of identical expressions always evaluates to false}} 873 } 874 int checkGreaterThanCastFloatDeclCompare12(void) { 875 float f = 7.1F; 876 return ((char)f > (int)f); // no warning 877 } 878 int checkGreaterThanBinaryOpFloatCompare1(void) { 879 int res; 880 float f= 3.14F; 881 res = (f + 3.14F > f + 3.14F); // no warning 882 return (0); 883 } 884 int checkGreaterThanBinaryOpFloatCompare2(void) { 885 float f = 7.1F; 886 float g = 7.1F; 887 return (f + 3.14F > g + 3.14F); // no warning 888 } 889 int checkGreaterThanBinaryOpFloatCompare3(void) { 890 int res; 891 float f= 3.14F; 892 res = ((int)f + 3.14F > (int)f + 3.14F); // no warning 893 return (0); 894 } 895 int checkGreaterThanBinaryOpFloatCompare4(void) { 896 int res; 897 float f= 3.14F; 898 res = ((int)f + 3.14F > (char)f + 3.14F); // no warning 899 return (0); 900 } 901 902 int checkGreaterThanNestedBinaryOpFloatCompare1(void) { 903 int res; 904 int t= 1; 905 int u= 2; 906 float f= 3.14F; 907 res = (((int)f + (3.14F - u)*t) > ((int)f + (3.14F - u)*t)); // no warning 908 return (0); 909 } 910 911 int checkGreaterThanNestedBinaryOpFloatCompare2(void) { 912 int res; 913 int t= 1; 914 int u= 2; 915 float f= 3.14F; 916 res = (((int)f + (u - 3.14F)*t) > ((int)f + (3.14F - u)*t)); // no warning 917 return (0); 918 } 919 920 int checkGreaterThanNestedBinaryOpFloatCompare3(void) { 921 int res; 922 int t= 1; 923 int u= 2; 924 float f= 3.14F; 925 res = (((int)f + (u - 3.14F)*t) > ((int)f + (3.14F - u)*(f + t > f + t))); // no warning 926 return (0); 927 } 928 929 /* end GT with float */ 930 931 /* GT with int */ 932 933 934 int checkGreaterThanIntLiteralCompare1(void) { 935 return (5 > 5); // expected-warning {{comparison of identical expressions always evaluates to false}} 936 } 937 938 int checkGreaterThanIntLiteralCompare2(void) { 939 return (6 > 7); // no warning 940 } 941 942 int checkGreaterThanIntDeclCompare1(void) { 943 int f = 7; 944 int g = 7; 945 946 return (f > g); // no warning 947 } 948 949 int checkGreaterThanIntDeclCompare3(void) { 950 int f = 7; 951 return (f > 7); // no warning 952 } 953 954 int checkGreaterThanIntDeclCompare4(void) { 955 int f = 7; 956 return (7 > f); // no warning 957 } 958 959 int checkGreaterThanCastIntDeclCompare11(void) { 960 int f = 7; 961 return ((int)f > (int)f); // expected-warning {{comparison of identical expressions always evaluates to false}} 962 } 963 int checkGreaterThanCastIntDeclCompare12(void) { 964 int f = 7; 965 return ((char)f > (int)f); // no warning 966 } 967 int checkGreaterThanBinaryOpIntCompare1(void) { 968 int res; 969 int f= 3; 970 res = (f + 3 > f + 3); // expected-warning {{comparison of identical expressions always evaluates to false}} 971 return (0); 972 } 973 int checkGreaterThanBinaryOpIntCompare2(void) { 974 int f = 7; 975 int g = 7; 976 return (f + 3 > g + 3); // no warning 977 } 978 int checkGreaterThanBinaryOpIntCompare3(void) { 979 int res; 980 int f= 3; 981 res = ((int)f + 3 > (int)f + 3); // expected-warning {{comparison of identical expressions always evaluates to false}} 982 return (0); 983 } 984 int checkGreaterThanBinaryOpIntCompare4(void) { 985 int res; 986 int f= 3; 987 res = ((int)f + 3 > (char)f + 3); // no warning 988 return (0); 989 } 990 991 int checkGreaterThanNestedBinaryOpIntCompare1(void) { 992 int res; 993 int t= 1; 994 int u= 2; 995 int f= 3; 996 res = (((int)f + (3 - u)*t) > ((int)f + (3 - u)*t)); // expected-warning {{comparison of identical expressions always evaluates to false}} 997 return (0); 998 } 999 1000 int checkGreaterThanNestedBinaryOpIntCompare2(void) { 1001 int res; 1002 int t= 1; 1003 int u= 2; 1004 int f= 3; 1005 res = (((int)f + (u - 3)*t) > ((int)f + (3 - u)*t)); // no warning 1006 return (0); 1007 } 1008 1009 int checkGreaterThanNestedBinaryOpIntCompare3(void) { 1010 int res; 1011 int t= 1; 1012 int u= 2; 1013 int f= 3; 1014 res = (((int)f + (u - 3)*t) > ((int)f + (3 - u)*(t + u > t + u))); // expected-warning {{comparison of identical expressions always evaluates to false}} 1015 return (0); 1016 } 1017 1018 /* end GT with int */ 1019 1020 /* end GT */ 1021 1022 1023 /* Checking use of identical expressions in conditional operator*/ 1024 1025 unsigned test_unsigned(unsigned a) { 1026 unsigned b = 1; 1027 a = a > 5 ? b : b; // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1028 return a; 1029 } 1030 1031 void test_signed() { 1032 int a = 0; 1033 a = a > 5 ? a : a; // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1034 } 1035 1036 void test_bool(bool a) { 1037 a = a > 0 ? a : a; // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1038 } 1039 1040 void test_float() { 1041 float a = 0; 1042 float b = 0; 1043 a = a > 5 ? a : a; // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1044 } 1045 1046 const char *test_string() { 1047 float a = 0; 1048 return a > 5 ? "abc" : "abc"; // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1049 } 1050 1051 void test_unsigned_expr() { 1052 unsigned a = 0; 1053 unsigned b = 0; 1054 a = a > 5 ? a+b : a+b; // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1055 } 1056 1057 void test_signed_expr() { 1058 int a = 0; 1059 int b = 1; 1060 a = a > 5 ? a+b : a+b; // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1061 } 1062 1063 void test_bool_expr(bool a) { 1064 bool b = 0; 1065 a = a > 0 ? a&&b : a&&b; // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1066 } 1067 1068 void test_unsigned_expr_negative() { 1069 unsigned a = 0; 1070 unsigned b = 0; 1071 a = a > 5 ? a+b : b+a; // no warning 1072 } 1073 1074 void test_signed_expr_negative() { 1075 int a = 0; 1076 int b = 1; 1077 a = a > 5 ? b+a : a+b; // no warning 1078 } 1079 1080 void test_bool_expr_negative(bool a) { 1081 bool b = 0; 1082 a = a > 0 ? a&&b : b&&a; // no warning 1083 } 1084 1085 void test_float_expr_positive() { 1086 float a = 0; 1087 float b = 0; 1088 a = a > 5 ? a+b : a+b; // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1089 } 1090 1091 void test_expr_positive_func() { 1092 unsigned a = 0; 1093 unsigned b = 1; 1094 a = a > 5 ? a+func() : a+func(); // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1095 } 1096 1097 void test_expr_negative_func() { 1098 unsigned a = 0; 1099 unsigned b = 1; 1100 a = a > 5 ? a+func() : a+func2(); // no warning 1101 } 1102 1103 void test_expr_positive_funcParam() { 1104 unsigned a = 0; 1105 unsigned b = 1; 1106 a = a > 5 ? a+funcParam(b) : a+funcParam(b); // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1107 } 1108 1109 void test_expr_negative_funcParam() { 1110 unsigned a = 0; 1111 unsigned b = 1; 1112 a = a > 5 ? a+funcParam(a) : a+funcParam(b); // no warning 1113 } 1114 1115 void test_expr_positive_inc() { 1116 unsigned a = 0; 1117 unsigned b = 1; 1118 a = a > 5 ? a++ : a++; // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1119 } 1120 1121 void test_expr_negative_inc() { 1122 unsigned a = 0; 1123 unsigned b = 1; 1124 a = a > 5 ? a++ : b++; // no warning 1125 } 1126 1127 void test_expr_positive_assign() { 1128 unsigned a = 0; 1129 unsigned b = 1; 1130 a = a > 5 ? a=1 : a=1; // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1131 } 1132 1133 void test_expr_negative_assign() { 1134 unsigned a = 0; 1135 unsigned b = 1; 1136 a = a > 5 ? a=1 : a=2; // no warning 1137 } 1138 1139 void test_signed_nested_expr() { 1140 int a = 0; 1141 int b = 1; 1142 int c = 3; 1143 a = a > 5 ? a+b+(c+a)*(a + b*(c+a)) : a+b+(c+a)*(a + b*(c+a)); // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1144 } 1145 1146 void test_signed_nested_expr_negative() { 1147 int a = 0; 1148 int b = 1; 1149 int c = 3; 1150 a = a > 5 ? a+b+(c+a)*(a + b*(c+a)) : a+b+(c+a)*(a + b*(a+c)); // no warning 1151 } 1152 1153 void test_signed_nested_cond_expr_negative() { 1154 int a = 0; 1155 int b = 1; 1156 int c = 3; 1157 a = a > 5 ? (b > 5 ? 1 : 4) : (b > 5 ? 2 : 4); // no warning 1158 } 1159 1160 void test_signed_nested_cond_expr() { 1161 int a = 0; 1162 int b = 1; 1163 int c = 3; 1164 a = a > 5 ? (b > 5 ? 1 : 4) : (b > 5 ? 4 : 4); // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1165 } 1166 1167 void test_identical_branches1(bool b) { 1168 int i = 0; 1169 if (b) { // expected-warning {{true and false branches are identical}} 1170 ++i; 1171 } else { 1172 ++i; 1173 } 1174 } 1175 1176 void test_identical_branches2(bool b) { 1177 int i = 0; 1178 if (b) { // expected-warning {{true and false branches are identical}} 1179 ++i; 1180 } else 1181 ++i; 1182 } 1183 1184 void test_identical_branches3(bool b) { 1185 int i = 0; 1186 if (b) { // no warning 1187 ++i; 1188 } else { 1189 i++; 1190 } 1191 } 1192 1193 void test_identical_branches4(bool b) { 1194 int i = 0; 1195 if (b) { // expected-warning {{true and false branches are identical}} 1196 } else { 1197 } 1198 } 1199 1200 void test_identical_branches_break(bool b) { 1201 while (true) { 1202 if (b) // expected-warning {{true and false branches are identical}} 1203 break; 1204 else 1205 break; 1206 } 1207 } 1208 1209 void test_identical_branches_continue(bool b) { 1210 while (true) { 1211 if (b) // expected-warning {{true and false branches are identical}} 1212 continue; 1213 else 1214 continue; 1215 } 1216 } 1217 1218 void test_identical_branches_func(bool b) { 1219 if (b) // expected-warning {{true and false branches are identical}} 1220 func(); 1221 else 1222 func(); 1223 } 1224 1225 void test_identical_branches_func_arguments(bool b) { 1226 if (b) // no-warning 1227 funcParam(1); 1228 else 1229 funcParam(2); 1230 } 1231 1232 void test_identical_branches_cast1(bool b) { 1233 long v = -7; 1234 if (b) // no-warning 1235 v = (signed int) v; 1236 else 1237 v = (unsigned int) v; 1238 } 1239 1240 void test_identical_branches_cast2(bool b) { 1241 long v = -7; 1242 if (b) // expected-warning {{true and false branches are identical}} 1243 v = (signed int) v; 1244 else 1245 v = (signed int) v; 1246 } 1247 1248 int test_identical_branches_return_int(bool b) { 1249 int i = 0; 1250 if (b) { // expected-warning {{true and false branches are identical}} 1251 i++; 1252 return i; 1253 } else { 1254 i++; 1255 return i; 1256 } 1257 } 1258 1259 int test_identical_branches_return_func(bool b) { 1260 if (b) { // expected-warning {{true and false branches are identical}} 1261 return func(); 1262 } else { 1263 return func(); 1264 } 1265 } 1266 1267 void test_identical_branches_for(bool b) { 1268 int i; 1269 int j; 1270 if (b) { // expected-warning {{true and false branches are identical}} 1271 for (i = 0, j = 0; i < 10; i++) 1272 j += 4; 1273 } else { 1274 for (i = 0, j = 0; i < 10; i++) 1275 j += 4; 1276 } 1277 } 1278 1279 void test_identical_branches_while(bool b) { 1280 int i = 10; 1281 if (b) { // expected-warning {{true and false branches are identical}} 1282 while (func()) 1283 i--; 1284 } else { 1285 while (func()) 1286 i--; 1287 } 1288 } 1289 1290 void test_identical_branches_while_2(bool b) { 1291 int i = 10; 1292 if (b) { // no-warning 1293 while (func()) 1294 i--; 1295 } else { 1296 while (func()) 1297 i++; 1298 } 1299 } 1300 1301 void test_identical_branches_do_while(bool b) { 1302 int i = 10; 1303 if (b) { // expected-warning {{true and false branches are identical}} 1304 do { 1305 i--; 1306 } while (func()); 1307 } else { 1308 do { 1309 i--; 1310 } while (func()); 1311 } 1312 } 1313 1314 void test_identical_branches_if(bool b, int i) { 1315 if (b) { // expected-warning {{true and false branches are identical}} 1316 if (i < 5) 1317 i += 10; 1318 } else { 1319 if (i < 5) 1320 i += 10; 1321 } 1322 } 1323 1324 void test_identical_bitwise1() { 1325 int a = 5 | 5; // expected-warning {{identical expressions on both sides of bitwise operator}} 1326 } 1327 1328 void test_identical_bitwise2() { 1329 int a = 5; 1330 int b = a | a; // expected-warning {{identical expressions on both sides of bitwise operator}} 1331 } 1332 1333 void test_identical_bitwise3() { 1334 int a = 5; 1335 int b = (a | a); // expected-warning {{identical expressions on both sides of bitwise operator}} 1336 } 1337 1338 void test_identical_bitwise4() { 1339 int a = 4; 1340 int b = a | 4; // no-warning 1341 } 1342 1343 void test_identical_bitwise5() { 1344 int a = 4; 1345 int b = 4; 1346 int c = a | b; // no-warning 1347 } 1348 1349 void test_identical_bitwise6() { 1350 int a = 5; 1351 int b = a | 4 | a; // expected-warning {{identical expressions on both sides of bitwise operator}} 1352 } 1353 1354 void test_identical_bitwise7() { 1355 int a = 5; 1356 int b = func() | func(); // no-warning 1357 } 1358 1359 void test_identical_logical1(int a) { 1360 if (a == 4 && a == 4) // expected-warning {{identical expressions on both sides of logical operator}} 1361 ; 1362 } 1363 1364 void test_identical_logical2(int a) { 1365 if (a == 4 || a == 5 || a == 4) // expected-warning {{identical expressions on both sides of logical operator}} 1366 ; 1367 } 1368 1369 void test_identical_logical3(int a) { 1370 if (a == 4 || a == 5 || a == 6) // no-warning 1371 ; 1372 } 1373 1374 void test_identical_logical4(int a) { 1375 if (a == func() || a == func()) // no-warning 1376 ; 1377 } 1378 1379 #pragma clang diagnostic push 1380 #pragma clang diagnostic ignored "-Wlogical-op-parentheses" 1381 void test_identical_logical5(int x, int y) { 1382 if (x == 4 && y == 5 || x == 4 && y == 6) // no-warning 1383 ; 1384 } 1385 1386 void test_identical_logical6(int x, int y) { 1387 if (x == 4 && y == 5 || x == 4 && y == 5) // expected-warning {{identical expressions on both sides of logical operator}} 1388 ; 1389 } 1390 1391 void test_identical_logical7(int x, int y) { 1392 // FIXME: We should warn here 1393 if (x == 4 && y == 5 || x == 4) 1394 ; 1395 } 1396 1397 void test_identical_logical8(int x, int y) { 1398 // FIXME: We should warn here 1399 if (x == 4 || y == 5 && x == 4) 1400 ; 1401 } 1402 1403 void test_identical_logical9(int x, int y) { 1404 // FIXME: We should warn here 1405 if (x == 4 || x == 4 && y == 5) 1406 ; 1407 } 1408 #pragma clang diagnostic pop 1409 1410 void test_warn_chained_if_stmts_1(int x) { 1411 if (x == 1) 1412 ; 1413 else if (x == 1) // expected-warning {{expression is identical to previous condition}} 1414 ; 1415 } 1416 1417 void test_warn_chained_if_stmts_2(int x) { 1418 if (x == 1) 1419 ; 1420 else if (x == 1) // expected-warning {{expression is identical to previous condition}} 1421 ; 1422 else if (x == 1) // expected-warning {{expression is identical to previous condition}} 1423 ; 1424 } 1425 1426 void test_warn_chained_if_stmts_3(int x) { 1427 if (x == 1) 1428 ; 1429 else if (x == 2) 1430 ; 1431 else if (x == 1) // expected-warning {{expression is identical to previous condition}} 1432 ; 1433 } 1434 1435 void test_warn_chained_if_stmts_4(int x) { 1436 if (x == 1) 1437 ; 1438 else if (func()) 1439 ; 1440 else if (x == 1) // expected-warning {{expression is identical to previous condition}} 1441 ; 1442 } 1443 1444 void test_warn_chained_if_stmts_5(int x) { 1445 if (x & 1) 1446 ; 1447 else if (x & 1) // expected-warning {{expression is identical to previous condition}} 1448 ; 1449 } 1450 1451 void test_warn_chained_if_stmts_6(int x) { 1452 if (x == 1) 1453 ; 1454 else if (x == 2) 1455 ; 1456 else if (x == 2) // expected-warning {{expression is identical to previous condition}} 1457 ; 1458 else if (x == 3) 1459 ; 1460 } 1461 1462 void test_warn_chained_if_stmts_7(int x) { 1463 if (x == 1) 1464 ; 1465 else if (x == 2) 1466 ; 1467 else if (x == 3) 1468 ; 1469 else if (x == 2) // expected-warning {{expression is identical to previous condition}} 1470 ; 1471 else if (x == 5) 1472 ; 1473 } 1474 1475 void test_warn_chained_if_stmts_8(int x) { 1476 if (x == 1) 1477 ; 1478 else if (x == 2) 1479 ; 1480 else if (x == 3) 1481 ; 1482 else if (x == 2) // expected-warning {{expression is identical to previous condition}} 1483 ; 1484 else if (x == 5) 1485 ; 1486 else if (x == 3) // expected-warning {{expression is identical to previous condition}} 1487 ; 1488 else if (x == 7) 1489 ; 1490 } 1491 1492 void test_nowarn_chained_if_stmts_1(int x) { 1493 if (func()) 1494 ; 1495 else if (func()) // no-warning 1496 ; 1497 } 1498 1499 void test_nowarn_chained_if_stmts_2(int x) { 1500 if (func()) 1501 ; 1502 else if (x == 1) 1503 ; 1504 else if (func()) // no-warning 1505 ; 1506 } 1507 1508 void test_nowarn_chained_if_stmts_3(int x) { 1509 if (x++) 1510 ; 1511 else if (x++) // no-warning 1512 ; 1513 } 1514 1515 void test_warn_wchar() { 1516 const wchar_t * a = 0 ? L"Warning" : L"Warning"; // expected-warning {{identical expressions on both sides of ':' in conditional expression}} 1517 } 1518 void test_nowarn_wchar() { 1519 const wchar_t * a = 0 ? L"No" : L"Warning"; 1520 } 1521 1522 void test_nowarn_long() { 1523 int a = 0, b = 0; 1524 long c; 1525 if (0) { 1526 b -= a; 1527 c = 0; 1528 } else { // no-warning 1529 b -= a; 1530 c = 0LL; 1531 } 1532 } 1533 1534 // Identical inner conditions 1535 1536 void test_warn_inner_if_1(int x) { 1537 if (x == 1) { 1538 if (x == 1) // expected-warning {{conditions of the inner and outer statements are identical}} 1539 ; 1540 } 1541 1542 // FIXME: Should warn here. The warning is currently not emitted because there 1543 // is code between the conditions. 1544 if (x == 1) { 1545 int y = x; 1546 if (x == 1) 1547 ; 1548 } 1549 } 1550 1551 void test_nowarn_inner_if_1(int x) { 1552 // Don't warn when condition has side effects. 1553 if (x++ == 1) { 1554 if (x++ == 1) 1555 ; 1556 } 1557 1558 // Don't warn when x is changed before inner condition. 1559 if (x < 10) { 1560 x++; 1561 if (x < 10) 1562 ; 1563 } 1564 } 1565