brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.1 KiB · eca6ab0 Raw
1029 lines · cpp
1// RUN: %clang_analyze_cc1 \2// RUN:    -analyzer-checker=debug.ExprInspection,core.builtin \3// RUN:    -analyzer-config aggressive-binary-operation-simplification=true \4// RUN:    -analyzer-config support-symbolic-integer-casts=false \5// RUN:    -analyzer-config eagerly-assume=false \6// RUN:    -verify %s7 8// RUN: %clang_analyze_cc1 \9// RUN:    -analyzer-checker=debug.ExprInspection,core.builtin \10// RUN:    -analyzer-config aggressive-binary-operation-simplification=true \11// RUN:    -analyzer-config support-symbolic-integer-casts=true \12// RUN:    -DSUPPORT_SYMBOLIC_INTEGER_CASTS \13// RUN:    -analyzer-config eagerly-assume=false \14// RUN:    -verify %s15 16void clang_analyzer_eval(bool x);17template <typename T>18void clang_analyzer_denote(T x, const char *literal);19template <typename T>20void clang_analyzer_express(T x);21 22void exit(int);23 24#define UINT_MAX (~0U)25#define INT_MAX (UINT_MAX & (UINT_MAX >> 1))26 27extern void __assert_fail (__const char *__assertion, __const char *__file,28    unsigned int __line, __const char *__function)29     __attribute__ ((__noreturn__));30#define assert(expr) \31  ((expr)  ? (void)(0)  : __assert_fail (#expr, __FILE__, __LINE__, __func__))32 33int g(void);34int f(void) {35  int x = g();36  // Assert that no overflows occur in this test file.37  // Assuming that concrete integers are also within that range.38  assert(x <= ((int)INT_MAX / 4));39  assert(x >= -((int)INT_MAX / 4));40  return x;41}42 43void compare_different_symbol_equal(void) {44  int x = f(), y = f();45  clang_analyzer_denote(x, "$x");46  clang_analyzer_denote(y, "$y");47  clang_analyzer_express(x == y); // expected-warning {{$x - $y == 0}}48}49 50void compare_different_symbol_plus_left_int_equal(void) {51  int x = f(), y = f();52  clang_analyzer_denote(x, "$x");53  clang_analyzer_denote(y, "$y");54  x += 1;55  clang_analyzer_express(x == y); // expected-warning {{$y - $x == 1}}56}57 58void compare_different_symbol_minus_left_int_equal(void) {59  int x = f(), y = f();60  clang_analyzer_denote(x, "$x");61  clang_analyzer_denote(y, "$y");62  x -= 1;63  clang_analyzer_express(x == y); // expected-warning {{$x - $y == 1}}64}65 66void compare_different_symbol_plus_right_int_equal(void) {67  int x = f(), y = f();68  clang_analyzer_denote(x, "$x");69  clang_analyzer_denote(y, "$y");70  y += 2;71  clang_analyzer_express(y); // expected-warning {{$y + 2}}72  clang_analyzer_express(x == y); // expected-warning {{$x - $y == 2}}73}74 75void compare_different_symbol_minus_right_int_equal(void) {76  int x = f(), y = f();77  clang_analyzer_denote(x, "$x");78  clang_analyzer_denote(y, "$y");79  y -= 2;80  clang_analyzer_express(y); // expected-warning {{$y - 2}}81  clang_analyzer_express(x == y); // expected-warning {{$y - $x == 2}}82}83 84void compare_different_symbol_plus_left_plus_right_int_equal(void) {85  int x = f(), y = f();86  clang_analyzer_denote(x, "$x");87  clang_analyzer_denote(y, "$y");88  x += 2;89  y += 1;90  clang_analyzer_express(x); // expected-warning {{$x + 2}}91  clang_analyzer_express(y); // expected-warning {{$y + 1}}92  clang_analyzer_express(x == y); // expected-warning {{$y - $x == 1}}93}94 95void compare_different_symbol_plus_left_minus_right_int_equal(void) {96  int x = f(), y = f();97  clang_analyzer_denote(x, "$x");98  clang_analyzer_denote(y, "$y");99  x += 2;100  y -= 1;101  clang_analyzer_express(x); // expected-warning {{$x + 2}}102  clang_analyzer_express(y); // expected-warning {{$y - 1}}103  clang_analyzer_express(x == y); // expected-warning {{$y - $x == 3}}104}105 106void compare_different_symbol_minus_left_plus_right_int_equal(void) {107  int x = f(), y = f();108  clang_analyzer_denote(x, "$x");109  clang_analyzer_denote(y, "$y");110  x -= 2;111  y += 1;112  clang_analyzer_express(x); // expected-warning {{$x - 2}}113  clang_analyzer_express(y); // expected-warning {{$y + 1}}114  clang_analyzer_express(x == y); // expected-warning {{$x - $y == 3}}115}116 117void compare_different_symbol_minus_left_minus_right_int_equal(void) {118  int x = f(), y = f();119  clang_analyzer_denote(x, "$x");120  clang_analyzer_denote(y, "$y");121  x -= 2;122  y -= 1;123  clang_analyzer_express(x); // expected-warning {{$x - 2}}124  clang_analyzer_express(y); // expected-warning {{$y - 1}}125  clang_analyzer_express(x == y); // expected-warning {{$x - $y == 1}}126}127 128void compare_same_symbol_equal(void) {129  int x = f(), y = x;130  clang_analyzer_denote(x, "$x");131  clang_analyzer_express(y); // expected-warning {{$x}}132  clang_analyzer_eval(x == y); // expected-warning {{TRUE}}133}134 135void compare_same_symbol_plus_left_int_equal(void) {136  int x = f(), y = x;137  clang_analyzer_denote(x, "$x");138  ++x;139  clang_analyzer_express(x); // expected-warning {{$x + 1}}140  clang_analyzer_express(y); // expected-warning {{$x}}141  clang_analyzer_eval(x == y); // expected-warning {{FALSE}}142}143 144void compare_same_symbol_minus_left_int_equal(void) {145  int x = f(), y = x;146  clang_analyzer_denote(x, "$x");147  --x;148  clang_analyzer_express(x); // expected-warning {{$x - 1}}149  clang_analyzer_express(y); // expected-warning {{$x}}150  clang_analyzer_eval(x == y); // expected-warning {{FALSE}}151}152 153void compare_same_symbol_plus_right_int_equal(void) {154  int x = f(), y = x + 1;155  clang_analyzer_denote(x, "$x");156  clang_analyzer_express(y); // expected-warning {{$x + 1}}157  clang_analyzer_eval(x == y); // expected-warning {{FALSE}}158}159 160void compare_same_symbol_minus_right_int_equal(void) {161  int x = f(), y = x - 1;162  clang_analyzer_denote(x, "$x");163  clang_analyzer_express(y); // expected-warning {{$x - 1}}164  clang_analyzer_eval(x == y); // expected-warning {{FALSE}}165}166 167void compare_same_symbol_plus_left_plus_right_int_equal(void) {168  int x = f(), y = x + 1;169  clang_analyzer_denote(x, "$x");170  ++x;171  clang_analyzer_express(x); // expected-warning {{$x + 1}}172  clang_analyzer_express(y); // expected-warning {{$x + 1}}173  clang_analyzer_eval(x == y); // expected-warning {{TRUE}}174}175 176void compare_same_symbol_plus_left_minus_right_int_equal(void) {177  int x = f(), y = x - 1;178  clang_analyzer_denote(x, "$x");179  ++x;180  clang_analyzer_express(x); // expected-warning {{$x + 1}}181  clang_analyzer_express(y); // expected-warning {{$x - 1}}182  clang_analyzer_eval(x == y); // expected-warning {{FALSE}}183}184 185void compare_same_symbol_minus_left_plus_right_int_equal(void) {186  int x = f(), y = x + 1;187  clang_analyzer_denote(x, "$x");188  --x;189  clang_analyzer_express(x); // expected-warning {{$x - 1}}190  clang_analyzer_express(y); // expected-warning {{$x + 1}}191  clang_analyzer_eval(x == y); // expected-warning {{FALSE}}192}193 194void compare_same_symbol_minus_left_minus_right_int_equal(void) {195  int x = f(), y = x - 1;196  clang_analyzer_denote(x, "$x");197  --x;198  clang_analyzer_express(x); // expected-warning {{$x - 1}}199  clang_analyzer_express(y); // expected-warning {{$x - 1}}200  clang_analyzer_eval(x == y); // expected-warning {{TRUE}}201}202 203void compare_different_symbol_less_or_equal(void) {204  int x = f(), y = f();205  clang_analyzer_denote(x, "$x");206  clang_analyzer_denote(y, "$y");207  clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 0}}208}209 210void compare_different_symbol_plus_left_int_less_or_equal(void) {211  int x = f(), y = f();212  clang_analyzer_denote(x, "$x");213  clang_analyzer_denote(y, "$y");214  x += 1;215  clang_analyzer_express(x); // expected-warning {{$x + 1}}216  clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 1}}217}218 219void compare_different_symbol_minus_left_int_less_or_equal(void) {220  int x = f(), y = f();221  clang_analyzer_denote(x, "$x");222  clang_analyzer_denote(y, "$y");223  x -= 1;224  clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 1}}225}226 227void compare_different_symbol_plus_right_int_less_or_equal(void) {228  int x = f(), y = f();229  clang_analyzer_denote(x, "$x");230  clang_analyzer_denote(y, "$y");231  y += 2;232  clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 2}}233}234 235void compare_different_symbol_minus_right_int_less_or_equal(void) {236  int x = f(), y = f();237  clang_analyzer_denote(x, "$x");238  clang_analyzer_denote(y, "$y");239  y -= 2;240  clang_analyzer_express(y); // expected-warning {{$y - 2}}241  clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 2}}242}243 244void compare_different_symbol_plus_left_plus_right_int_less_or_equal(void) {245  int x = f(), y = f();246  clang_analyzer_denote(x, "$x");247  clang_analyzer_denote(y, "$y");248  x += 2;249  y += 1;250  clang_analyzer_express(x); // expected-warning {{$x + 2}}251  clang_analyzer_express(y); // expected-warning {{$y + 1}}252  clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 1}}253}254 255void compare_different_symbol_plus_left_minus_right_int_less_or_equal(void) {256  int x = f(), y = f();257  clang_analyzer_denote(x, "$x");258  clang_analyzer_denote(y, "$y");259  x += 2;260  y -= 1;261  clang_analyzer_express(x); // expected-warning {{$x + 2}}262  clang_analyzer_express(y); // expected-warning {{$y - 1}}263  clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 3}}264}265 266void compare_different_symbol_minus_left_plus_right_int_less_or_equal(void) {267  int x = f(), y = f();268  clang_analyzer_denote(x, "$x");269  clang_analyzer_denote(y, "$y");270  x -= 2;271  y += 1;272  clang_analyzer_express(x); // expected-warning {{$x - 2}}273  clang_analyzer_express(y); // expected-warning {{$y + 1}}274  clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 3}}275}276 277void compare_different_symbol_minus_left_minus_right_int_less_or_equal(void) {278  int x = f(), y = f();279  clang_analyzer_denote(x, "$x");280  clang_analyzer_denote(y, "$y");281  x -= 2;282  y -= 1;283  clang_analyzer_express(x); // expected-warning {{$x - 2}}284  clang_analyzer_express(y); // expected-warning {{$y - 1}}285  clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 1}}286}287 288void compare_same_symbol_less_or_equal(void) {289  int x = f(), y = x;290  clang_analyzer_denote(x, "$x");291  clang_analyzer_express(y); // expected-warning {{$x}}292  clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}293}294 295void compare_same_symbol_plus_left_int_less_or_equal(void) {296  int x = f(), y = x;297  clang_analyzer_denote(x, "$x");298  ++x;299  clang_analyzer_express(x); // expected-warning {{$x + 1}}300  clang_analyzer_express(y); // expected-warning {{$x}}301  clang_analyzer_eval(x <= y); // expected-warning {{FALSE}}302}303 304void compare_same_symbol_minus_left_int_less_or_equal(void) {305  int x = f(), y = x;306  clang_analyzer_denote(x, "$x");307  --x;308  clang_analyzer_express(x); // expected-warning {{$x - 1}}309  clang_analyzer_express(y); // expected-warning {{$x}}310  clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}311}312 313void compare_same_symbol_plus_right_int_less_or_equal(void) {314  int x = f(), y = x + 1;315  clang_analyzer_denote(x, "$x");316  clang_analyzer_express(y); // expected-warning {{$x + 1}}317  clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}318}319 320void compare_same_symbol_minus_right_int_less_or_equal(void) {321  int x = f(), y = x - 1;322  clang_analyzer_denote(x, "$x");323  clang_analyzer_express(y); // expected-warning {{$x - 1}}324  clang_analyzer_eval(x <= y); // expected-warning {{FALSE}}325}326 327void compare_same_symbol_plus_left_plus_right_int_less_or_equal(void) {328  int x = f(), y = x + 1;329  clang_analyzer_denote(x, "$x");330  ++x;331  clang_analyzer_express(x); // expected-warning {{$x + 1}}332  clang_analyzer_express(y); // expected-warning {{$x + 1}}333  clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}334}335 336void compare_same_symbol_plus_left_minus_right_int_less_or_equal(void) {337  int x = f(), y = x - 1;338  clang_analyzer_denote(x, "$x");339  ++x;340  clang_analyzer_express(x); // expected-warning {{$x + 1}}341  clang_analyzer_express(y); // expected-warning {{$x - 1}}342  clang_analyzer_eval(x <= y); // expected-warning {{FALSE}}343}344 345void compare_same_symbol_minus_left_plus_right_int_less_or_equal(void) {346  int x = f(), y = x + 1;347  clang_analyzer_denote(x, "$x");348  --x;349  clang_analyzer_express(x); // expected-warning {{$x - 1}}350  clang_analyzer_express(y); // expected-warning {{$x + 1}}351  clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}352}353 354void compare_same_symbol_minus_left_minus_right_int_less_or_equal(void) {355  int x = f(), y = x - 1;356  clang_analyzer_denote(x, "$x");357  --x;358  clang_analyzer_express(x); // expected-warning {{$x - 1}}359  clang_analyzer_express(y); // expected-warning {{$x - 1}}360  clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}361}362 363void compare_different_symbol_less(void) {364  int x = f(), y = f();365  clang_analyzer_denote(x, "$x");366  clang_analyzer_denote(y, "$y");367  clang_analyzer_express(y); // expected-warning {{$y}}368  clang_analyzer_express(x < y); // expected-warning {{$x - $y < 0}}369}370 371void compare_different_symbol_plus_left_int_less(void) {372  int x = f(), y = f();373  clang_analyzer_denote(x, "$x");374  clang_analyzer_denote(y, "$y");375  x += 1;376  clang_analyzer_express(x); // expected-warning {{$x + 1}}377  clang_analyzer_express(y); // expected-warning {{$y}}378  clang_analyzer_express(x < y); // expected-warning {{$y - $x > 1}}379}380 381void compare_different_symbol_minus_left_int_less(void) {382  int x = f(), y = f();383  clang_analyzer_denote(x, "$x");384  clang_analyzer_denote(y, "$y");385  x -= 1;386  clang_analyzer_express(x); // expected-warning {{$x - 1}}387  clang_analyzer_express(y); // expected-warning {{$y}}388  clang_analyzer_express(x < y); // expected-warning {{$x - $y < 1}}389}390 391void compare_different_symbol_plus_right_int_less(void) {392  int x = f(), y = f();393  clang_analyzer_denote(x, "$x");394  clang_analyzer_denote(y, "$y");395  y += 2;396  clang_analyzer_express(y); // expected-warning {{$y + 2}}397  clang_analyzer_express(x < y); // expected-warning {{$x - $y < 2}}398}399 400void compare_different_symbol_minus_right_int_less(void) {401  int x = f(), y = f();402  clang_analyzer_denote(x, "$x");403  clang_analyzer_denote(y, "$y");404  y -= 2;405  clang_analyzer_express(y); // expected-warning {{$y - 2}}406  clang_analyzer_express(x < y); // expected-warning {{$y - $x > 2}}407}408 409void compare_different_symbol_plus_left_plus_right_int_less(void) {410  int x = f(), y = f();411  clang_analyzer_denote(x, "$x");412  clang_analyzer_denote(y, "$y");413  x += 2;414  y += 1;415  clang_analyzer_express(x); // expected-warning {{$x + 2}}416  clang_analyzer_express(y); // expected-warning {{$y + 1}}417  clang_analyzer_express(x < y); // expected-warning {{$y - $x > 1}}418}419 420void compare_different_symbol_plus_left_minus_right_int_less(void) {421  int x = f(), y = f();422  clang_analyzer_denote(x, "$x");423  clang_analyzer_denote(y, "$y");424  x += 2;425  y -= 1;426  clang_analyzer_express(x); // expected-warning {{$x + 2}}427  clang_analyzer_express(y); // expected-warning {{$y - 1}}428  clang_analyzer_express(x < y); // expected-warning {{$y - $x > 3}}429}430 431void compare_different_symbol_minus_left_plus_right_int_less(void) {432  int x = f(), y = f();433  clang_analyzer_denote(x, "$x");434  clang_analyzer_denote(y, "$y");435  x -= 2;436  y += 1;437  clang_analyzer_express(x); // expected-warning {{$x - 2}}438  clang_analyzer_express(y); // expected-warning {{$y + 1}}439  clang_analyzer_express(x < y); // expected-warning {{$x - $y < 3}}440}441 442void compare_different_symbol_minus_left_minus_right_int_less(void) {443  int x = f(), y = f();444  clang_analyzer_denote(x, "$x");445  clang_analyzer_denote(y, "$y");446  x -= 2;447  y -= 1;448  clang_analyzer_express(x); // expected-warning {{$x - 2}}449  clang_analyzer_express(y); // expected-warning {{$y - 1}}450  clang_analyzer_express(x < y); // expected-warning {{$x - $y < 1}}451}452 453void compare_same_symbol_less(void) {454  int x = f(), y = x;455  clang_analyzer_denote(x, "$x");456  clang_analyzer_express(y); // expected-warning {{$x}}457  clang_analyzer_eval(x < y); // expected-warning {{FALSE}}458}459 460void compare_same_symbol_plus_left_int_less(void) {461  int x = f(), y = x;462  clang_analyzer_denote(x, "$x");463  ++x;464  clang_analyzer_express(x); // expected-warning {{$x + 1}}465  clang_analyzer_express(y); // expected-warning {{$x}}466  clang_analyzer_eval(x < y); // expected-warning {{FALSE}}467}468 469void compare_same_symbol_minus_left_int_less(void) {470  int x = f(), y = x;471  clang_analyzer_denote(x, "$x");472  --x;473  clang_analyzer_express(x); // expected-warning {{$x - 1}}474  clang_analyzer_express(y); // expected-warning {{$x}}475  clang_analyzer_eval(x < y); // expected-warning {{TRUE}}476}477 478void compare_same_symbol_plus_right_int_less(void) {479  int x = f(), y = x + 1;480  clang_analyzer_denote(x, "$x");481  clang_analyzer_express(y); // expected-warning {{$x + 1}}482  clang_analyzer_eval(x < y); // expected-warning {{TRUE}}483}484 485void compare_same_symbol_minus_right_int_less(void) {486  int x = f(), y = x - 1;487  clang_analyzer_denote(x, "$x");488  clang_analyzer_express(y); // expected-warning {{$x - 1}}489  clang_analyzer_eval(x < y); // expected-warning {{FALSE}}490}491 492void compare_same_symbol_plus_left_plus_right_int_less(void) {493  int x = f(), y = x + 1;494  clang_analyzer_denote(x, "$x");495  ++x;496  clang_analyzer_express(x); // expected-warning {{$x + 1}}497  clang_analyzer_express(y); // expected-warning {{$x + 1}}498  clang_analyzer_eval(x < y); // expected-warning {{FALSE}}499}500 501void compare_same_symbol_plus_left_minus_right_int_less(void) {502  int x = f(), y = x - 1;503  clang_analyzer_denote(x, "$x");504  ++x;505  clang_analyzer_express(x); // expected-warning {{$x + 1}}506  clang_analyzer_express(y); // expected-warning {{$x - 1}}507  clang_analyzer_eval(x < y); // expected-warning {{FALSE}}508}509 510void compare_same_symbol_minus_left_plus_right_int_less(void) {511  int x = f(), y = x + 1;512  clang_analyzer_denote(x, "$x");513  --x;514  clang_analyzer_express(x); // expected-warning {{$x - 1}}515  clang_analyzer_express(y); // expected-warning {{$x + 1}}516  clang_analyzer_eval(x < y); // expected-warning {{TRUE}}517}518 519void compare_same_symbol_minus_left_minus_right_int_less(void) {520  int x = f(), y = x - 1;521  clang_analyzer_denote(x, "$x");522  --x;523  clang_analyzer_express(x); // expected-warning {{$x - 1}}524  clang_analyzer_express(y); // expected-warning {{$x - 1}}525  clang_analyzer_eval(x < y); // expected-warning {{FALSE}}526}527 528// Rearrange should happen on signed types only (tryRearrange):529//530//  // Rearrange signed symbolic expressions only531//  if (!SingleTy->isSignedIntegerOrEnumerationType())532//    return std::nullopt;533//534// Without the symbolic casts, the SVal for `x` in `unsigned x = f()` will be535// the signed `int`. However, with the symbolic casts it will be `unsigned`.536// Thus, these tests are meaningful only if the cast is not emitted.537#ifndef SUPPORT_SYMBOLIC_INTEGER_CASTS538 539void compare_different_symbol_equal_unsigned(void) {540  unsigned x = f(), y = f();541  clang_analyzer_denote(x, "$x");542  clang_analyzer_denote(y, "$y");543  clang_analyzer_express(y); // expected-warning {{$y}}544  clang_analyzer_express(x == y); // expected-warning {{$x - $y == 0}}545}546 547void compare_different_symbol_plus_left_int_equal_unsigned(void) {548  unsigned x = f() + 1, y = f();549  clang_analyzer_denote(x - 1, "$x");550  clang_analyzer_denote(y, "$y");551  clang_analyzer_express(x); // expected-warning {{$x + 1}}552  clang_analyzer_express(y); // expected-warning {{$y}}553  clang_analyzer_express(x == y); // expected-warning {{$y - $x == 1}}554}555 556void compare_different_symbol_minus_left_int_equal_unsigned(void) {557  unsigned x = f() - 1, y = f();558  clang_analyzer_denote(x + 1, "$x");559  clang_analyzer_denote(y, "$y");560  clang_analyzer_express(x); // expected-warning {{$x - 1}}561  clang_analyzer_express(y); // expected-warning {{$y}}562  clang_analyzer_express(x == y); // expected-warning {{$x - $y == 1}}563}564 565void compare_different_symbol_plus_right_int_equal_unsigned(void) {566  unsigned x = f(), y = f() + 2;567  clang_analyzer_denote(x, "$x");568  clang_analyzer_denote(y - 2, "$y");569  clang_analyzer_express(y); // expected-warning {{$y + 2}}570  clang_analyzer_express(x == y); // expected-warning {{$x - $y == 2}}571}572 573void compare_different_symbol_minus_right_int_equal_unsigned(void) {574  unsigned x = f(), y = f() - 2;575  clang_analyzer_denote(x, "$x");576  clang_analyzer_denote(y + 2, "$y");577  clang_analyzer_express(y); // expected-warning {{$y - 2}}578  clang_analyzer_express(x == y); // expected-warning {{$y - $x == 2}}579}580 581void compare_different_symbol_plus_left_plus_right_int_equal_unsigned(void) {582  unsigned x = f() + 2, y = f() + 1;583  clang_analyzer_denote(x - 2, "$x");584  clang_analyzer_denote(y - 1, "$y");585  clang_analyzer_express(x); // expected-warning {{$x + 2}}586  clang_analyzer_express(y); // expected-warning {{$y + 1}}587  clang_analyzer_express(x == y); // expected-warning {{$y - $x == 1}}588}589 590void compare_different_symbol_plus_left_minus_right_int_equal_unsigned(void) {591  unsigned x = f() + 2, y = f() - 1;592  clang_analyzer_denote(x - 2, "$x");593  clang_analyzer_denote(y + 1, "$y");594  clang_analyzer_express(x); // expected-warning {{$x + 2}}595  clang_analyzer_express(y); // expected-warning {{$y - 1}}596  clang_analyzer_express(x == y); // expected-warning {{$y - $x == 3}}597}598 599void compare_different_symbol_minus_left_plus_right_int_equal_unsigned(void) {600  unsigned x = f() - 2, y = f() + 1;601  clang_analyzer_denote(x + 2, "$x");602  clang_analyzer_denote(y - 1, "$y");603  clang_analyzer_express(x); // expected-warning {{$x - 2}}604  clang_analyzer_express(y); // expected-warning {{$y + 1}}605  clang_analyzer_express(x == y); // expected-warning {{$x - $y == 3}}606}607 608void compare_different_symbol_minus_left_minus_right_int_equal_unsigned(void) {609  unsigned x = f() - 2, y = f() - 1;610  clang_analyzer_denote(x + 2, "$x");611  clang_analyzer_denote(y + 1, "$y");612  clang_analyzer_express(x); // expected-warning {{$x - 2}}613  clang_analyzer_express(y); // expected-warning {{$y - 1}}614  clang_analyzer_express(x == y); // expected-warning {{$x - $y == 1}}615}616 617void compare_same_symbol_equal_unsigned(void) {618  unsigned x = f(), y = x;619  clang_analyzer_denote(x, "$x");620  clang_analyzer_express(y); // expected-warning {{$x}}621  clang_analyzer_eval(x == y); // expected-warning {{TRUE}}622}623 624void compare_same_symbol_plus_left_int_equal_unsigned(void) {625  unsigned x = f(), y = x;626  clang_analyzer_denote(x, "$x");627  ++x;628  clang_analyzer_express(x); // expected-warning {{$x + 1}}629  clang_analyzer_express(y); // expected-warning {{$x}}630  clang_analyzer_express(x == y); // expected-warning {{$x + 1U == $x}}631}632 633void compare_same_symbol_minus_left_int_equal_unsigned(void) {634  unsigned x = f(), y = x;635  clang_analyzer_denote(x, "$x");636  --x;637  clang_analyzer_express(x); // expected-warning {{$x - 1}}638  clang_analyzer_express(y); // expected-warning {{$x}}639  clang_analyzer_express(x == y); // expected-warning {{$x - 1U == $x}}640}641 642void compare_same_symbol_plus_right_int_equal_unsigned(void) {643  unsigned x = f(), y = x + 1;644  clang_analyzer_denote(x, "$x");645  clang_analyzer_express(y); // expected-warning {{$x + 1}}646  clang_analyzer_express(x == y); // expected-warning {{$x == $x + 1U}}647}648 649void compare_same_symbol_minus_right_int_equal_unsigned(void) {650  unsigned x = f(), y = x - 1;651  clang_analyzer_denote(x, "$x");652  clang_analyzer_express(y); // expected-warning {{$x - 1}}653  clang_analyzer_express(x == y); // expected-warning {{$x == $x - 1U}}654}655 656void compare_same_symbol_plus_left_plus_right_int_equal_unsigned(void) {657  unsigned x = f(), y = x + 1;658  clang_analyzer_denote(x, "$x");659  ++x;660  clang_analyzer_express(x); // expected-warning {{$x + 1}}661  clang_analyzer_express(y); // expected-warning {{$x + 1}}662  clang_analyzer_eval(x == y); // expected-warning {{TRUE}}663}664 665void compare_same_symbol_plus_left_minus_right_int_equal_unsigned(void) {666  unsigned x = f(), y = x - 1;667  clang_analyzer_denote(x, "$x");668  ++x;669  clang_analyzer_express(x); // expected-warning {{$x + 1}}670  clang_analyzer_express(y); // expected-warning {{$x - 1}}671  clang_analyzer_express(x == y); // expected-warning {{$x + 1U == $x - 1U}}672}673 674void compare_same_symbol_minus_left_plus_right_int_equal_unsigned(void) {675  unsigned x = f(), y = x + 1;676  clang_analyzer_denote(x, "$x");677  --x;678  clang_analyzer_express(x); // expected-warning {{$x - 1}}679  clang_analyzer_express(y); // expected-warning {{$x + 1}}680  clang_analyzer_express(x == y); // expected-warning {{$x - 1U == $x + 1U}}681}682 683void compare_same_symbol_minus_left_minus_right_int_equal_unsigned(void) {684  unsigned x = f(), y = x - 1;685  clang_analyzer_denote(x, "$x");686  --x;687  clang_analyzer_express(x); // expected-warning {{$x - 1}}688  clang_analyzer_express(y); // expected-warning {{$x - 1}}689  clang_analyzer_eval(x == y); // expected-warning {{TRUE}}690}691 692void compare_different_symbol_less_or_equal_unsigned(void) {693  unsigned x = f(), y = f();694  clang_analyzer_denote(x, "$x");695  clang_analyzer_denote(y, "$y");696  clang_analyzer_express(y); // expected-warning {{$y}}697  clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 0}}698}699 700void compare_different_symbol_plus_left_int_less_or_equal_unsigned(void) {701  unsigned x = f() + 1, y = f();702  clang_analyzer_denote(x - 1, "$x");703  clang_analyzer_denote(y, "$y");704  clang_analyzer_express(x); // expected-warning {{$x + 1}}705  clang_analyzer_express(y); // expected-warning {{$y}}706  clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 1}}707}708 709void compare_different_symbol_minus_left_int_less_or_equal_unsigned(void) {710  unsigned x = f() - 1, y = f();711  clang_analyzer_denote(x + 1, "$x");712  clang_analyzer_denote(y, "$y");713  clang_analyzer_express(x); // expected-warning {{$x - 1}}714  clang_analyzer_express(y); // expected-warning {{$y}}715  clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 1}}716}717 718void compare_different_symbol_plus_right_int_less_or_equal_unsigned(void) {719  unsigned x = f(), y = f() + 2;720  clang_analyzer_denote(x, "$x");721  clang_analyzer_denote(y - 2, "$y");722  clang_analyzer_express(y); // expected-warning {{$y + 2}}723  clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 2}}724}725 726void compare_different_symbol_minus_right_int_less_or_equal_unsigned(void) {727  unsigned x = f(), y = f() - 2;728  clang_analyzer_denote(x, "$x");729  clang_analyzer_denote(y + 2, "$y");730  clang_analyzer_express(y); // expected-warning {{$y - 2}}731  clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 2}}732}733 734void compare_different_symbol_plus_left_plus_right_int_less_or_equal_unsigned(void) {735  unsigned x = f() + 2, y = f() + 1;736  clang_analyzer_denote(x - 2, "$x");737  clang_analyzer_denote(y - 1, "$y");738  clang_analyzer_express(x); // expected-warning {{$x + 2}}739  clang_analyzer_express(y); // expected-warning {{$y + 1}}740  clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 1}}741}742 743void compare_different_symbol_plus_left_minus_right_int_less_or_equal_unsigned(void) {744  unsigned x = f() + 2, y = f() - 1;745  clang_analyzer_denote(x - 2, "$x");746  clang_analyzer_denote(y + 1, "$y");747  clang_analyzer_express(x); // expected-warning {{$x + 2}}748  clang_analyzer_express(y); // expected-warning {{$y - 1}}749  clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 3}}750}751 752void compare_different_symbol_minus_left_plus_right_int_less_or_equal_unsigned(void) {753  unsigned x = f() - 2, y = f() + 1;754  clang_analyzer_denote(x + 2, "$x");755  clang_analyzer_denote(y - 1, "$y");756  clang_analyzer_express(x); // expected-warning {{$x - 2}}757  clang_analyzer_express(y); // expected-warning {{$y + 1}}758  clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 3}}759}760 761void compare_different_symbol_minus_left_minus_right_int_less_or_equal_unsigned(void) {762  unsigned x = f() - 2, y = f() - 1;763  clang_analyzer_denote(x + 2, "$x");764  clang_analyzer_denote(y + 1, "$y");765  clang_analyzer_express(x); // expected-warning {{$x - 2}}766  clang_analyzer_express(y); // expected-warning {{$y - 1}}767  clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 1}}768}769 770void compare_same_symbol_less_or_equal_unsigned(void) {771  unsigned x = f(), y = x;772  clang_analyzer_denote(x, "$x");773  clang_analyzer_express(y); // expected-warning {{$x}}774  clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}775}776 777void compare_same_symbol_plus_left_int_less_or_equal_unsigned(void) {778  unsigned x = f(), y = x;779  clang_analyzer_denote(x, "$x");780  ++x;781  clang_analyzer_express(x); // expected-warning {{$x + 1}}782  clang_analyzer_express(y); // expected-warning {{$x}}783  clang_analyzer_express(x <= y); // expected-warning {{$x + 1U <= $x}}784}785 786void compare_same_symbol_minus_left_int_less_or_equal_unsigned(void) {787  unsigned x = f(), y = x;788  clang_analyzer_denote(x, "$x");789  --x;790  clang_analyzer_express(x); // expected-warning {{$x - 1}}791  clang_analyzer_express(y); // expected-warning {{$x}}792  clang_analyzer_express(x <= y); // expected-warning {{$x - 1U <= $x}}793}794 795void compare_same_symbol_plus_right_int_less_or_equal_unsigned(void) {796  unsigned x = f(), y = x + 1;797  clang_analyzer_denote(x, "$x");798  clang_analyzer_express(y); // expected-warning {{$x + 1}}799  clang_analyzer_express(x <= y); // expected-warning {{$x <= $x + 1U}}800}801 802void compare_same_symbol_minus_right_int_less_or_equal_unsigned(void) {803  unsigned x = f(), y = x - 1;804  clang_analyzer_denote(x, "$x");805  clang_analyzer_express(y); // expected-warning {{$x - 1}}806  clang_analyzer_express(x <= y); // expected-warning {{$x <= $x - 1U}}807}808 809void compare_same_symbol_plus_left_plus_right_int_less_or_equal_unsigned(void) {810  unsigned x = f(), y = x + 1;811  clang_analyzer_denote(x, "$x");812  ++x;813  clang_analyzer_express(x); // expected-warning {{$x + 1}}814  clang_analyzer_express(y); // expected-warning {{$x + 1}}815  clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}816}817 818void compare_same_symbol_plus_left_minus_right_int_less_or_equal_unsigned(void) {819  unsigned x = f(), y = x - 1;820  clang_analyzer_denote(x, "$x");821  ++x;822  clang_analyzer_express(x); // expected-warning {{$x + 1}}823  clang_analyzer_express(y); // expected-warning {{$x - 1}}824  clang_analyzer_express(x <= y); // expected-warning {{$x + 1U <= $x - 1U}}825}826 827void compare_same_symbol_minus_left_plus_right_int_less_or_equal_unsigned(void) {828  unsigned x = f(), y = x + 1;829  clang_analyzer_denote(x, "$x");830  --x;831  clang_analyzer_express(x); // expected-warning {{$x - 1}}832  clang_analyzer_express(y); // expected-warning {{$x + 1}}833  clang_analyzer_express(x <= y); // expected-warning {{$x - 1U <= $x + 1U}}834}835 836void compare_same_symbol_minus_left_minus_right_int_less_or_equal_unsigned(void) {837  unsigned x = f(), y = x - 1;838  clang_analyzer_denote(x, "$x");839  --x;840  clang_analyzer_express(x); // expected-warning {{$x - 1}}841  clang_analyzer_express(y); // expected-warning {{$x - 1}}842  clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}843}844 845void compare_different_symbol_less_unsigned(void) {846  unsigned x = f(), y = f();847  clang_analyzer_denote(x, "$x");848  clang_analyzer_denote(y, "$y");849  clang_analyzer_express(y); // expected-warning {{$y}}850  clang_analyzer_express(x < y); // expected-warning {{$x - $y < 0}}851}852 853void compare_different_symbol_plus_left_int_less_unsigned(void) {854  unsigned x = f() + 1, y = f();855  clang_analyzer_denote(x - 1, "$x");856  clang_analyzer_denote(y, "$y");857  clang_analyzer_express(x); // expected-warning {{$x + 1}}858  clang_analyzer_express(y); // expected-warning {{$y}}859  clang_analyzer_express(x < y); // expected-warning {{$y - $x > 1}}860}861 862void compare_different_symbol_minus_left_int_less_unsigned(void) {863  unsigned x = f() - 1, y = f();864  clang_analyzer_denote(x + 1, "$x");865  clang_analyzer_denote(y, "$y");866  clang_analyzer_express(x); // expected-warning {{$x - 1}}867  clang_analyzer_express(y); // expected-warning {{$y}}868  clang_analyzer_express(x < y); // expected-warning {{$x - $y < 1}}869}870 871void compare_different_symbol_plus_right_int_less_unsigned(void) {872  unsigned x = f(), y = f() + 2;873  clang_analyzer_denote(x, "$x");874  clang_analyzer_denote(y - 2, "$y");875  clang_analyzer_express(y); // expected-warning {{$y + 2}}876  clang_analyzer_express(x < y); // expected-warning {{$x - $y < 2}}877}878 879void compare_different_symbol_minus_right_int_less_unsigned(void) {880  unsigned x = f(), y = f() - 2;881  clang_analyzer_denote(x, "$x");882  clang_analyzer_denote(y + 2, "$y");883  clang_analyzer_express(y); // expected-warning {{$y - 2}}884  clang_analyzer_express(x < y); // expected-warning {{$y - $x > 2}}885}886 887void compare_different_symbol_plus_left_plus_right_int_less_unsigned(void) {888  unsigned x = f() + 2, y = f() + 1;889  clang_analyzer_denote(x - 2, "$x");890  clang_analyzer_denote(y - 1, "$y");891  clang_analyzer_express(x); // expected-warning {{$x + 2}}892  clang_analyzer_express(y); // expected-warning {{$y + 1}}893  clang_analyzer_express(x < y); // expected-warning {{$y - $x > 1}}894}895 896void compare_different_symbol_plus_left_minus_right_int_less_unsigned(void) {897  unsigned x = f() + 2, y = f() - 1;898  clang_analyzer_denote(x - 2, "$x");899  clang_analyzer_denote(y + 1, "$y");900  clang_analyzer_express(x); // expected-warning {{$x + 2}}901  clang_analyzer_express(y); // expected-warning {{$y - 1}}902  clang_analyzer_express(x < y); // expected-warning {{$y - $x > 3}}903}904 905void compare_different_symbol_minus_left_plus_right_int_less_unsigned(void) {906  unsigned x = f() - 2, y = f() + 1;907  clang_analyzer_denote(x + 2, "$x");908  clang_analyzer_denote(y - 1, "$y");909  clang_analyzer_express(x); // expected-warning {{$x - 2}}910  clang_analyzer_express(y); // expected-warning {{$y + 1}}911  clang_analyzer_express(x < y); // expected-warning {{$x - $y < 3}}912}913 914void compare_different_symbol_minus_left_minus_right_int_less_unsigned(void) {915  unsigned x = f() - 2, y = f() - 1;916  clang_analyzer_denote(x + 2, "$x");917  clang_analyzer_denote(y + 1, "$y");918  clang_analyzer_express(x); // expected-warning {{$x - 2}}919  clang_analyzer_express(y); // expected-warning {{$y - 1}}920  clang_analyzer_express(x < y); // expected-warning {{$x - $y < 1}}921}922 923#endif924 925// These pass even with aggressive-binary-operation-simplification=false926 927void compare_same_symbol_less_unsigned(void) {928  unsigned x = f(), y = x;929  clang_analyzer_denote(x, "$x");930  clang_analyzer_express(y); // expected-warning {{$x}}931  clang_analyzer_eval(x < y); // expected-warning {{FALSE}}932}933 934void compare_same_symbol_plus_left_int_less_unsigned(void) {935  unsigned x = f(), y = x;936  clang_analyzer_denote(x, "$x");937  ++x;938  clang_analyzer_express(x); // expected-warning {{$x + 1}}939  clang_analyzer_express(y); // expected-warning {{$x}}940  clang_analyzer_express(x < y); // expected-warning {{$x + 1U < $x}}941}942 943void compare_same_symbol_minus_left_int_less_unsigned(void) {944  unsigned x = f(), y = x;945  clang_analyzer_denote(x, "$x");946  --x;947  clang_analyzer_express(x); // expected-warning {{$x - 1}}948  clang_analyzer_express(y); // expected-warning {{$x}}949  clang_analyzer_express(x < y); // expected-warning {{$x - 1U < $x}}950}951 952void compare_same_symbol_plus_right_int_less_unsigned(void) {953  unsigned x = f(), y = x + 1;954  clang_analyzer_denote(x, "$x");955  clang_analyzer_express(y); // expected-warning {{$x + 1}}956  clang_analyzer_express(x < y); // expected-warning {{$x < $x + 1U}}957}958 959void compare_same_symbol_minus_right_int_less_unsigned(void) {960  unsigned x = f(), y = x - 1;961  clang_analyzer_denote(x, "$x");962  clang_analyzer_express(y); // expected-warning {{$x - 1}}963  clang_analyzer_express(x < y); // expected-warning {{$x < $x - 1U}}964}965 966void compare_same_symbol_plus_left_plus_right_int_less_unsigned(void) {967  unsigned x = f(), y = x + 1;968  clang_analyzer_denote(x, "$x");969  ++x;970  clang_analyzer_express(x); // expected-warning {{$x + 1}}971  clang_analyzer_express(y); // expected-warning {{$x + 1}}972  clang_analyzer_eval(x < y); // expected-warning {{FALSE}}973}974 975void compare_same_symbol_plus_left_minus_right_int_less_unsigned(void) {976  unsigned x = f(), y = x - 1;977  clang_analyzer_denote(x, "$x");978  ++x;979  clang_analyzer_express(x); // expected-warning {{$x + 1}}980  clang_analyzer_express(y); // expected-warning {{$x - 1}}981  clang_analyzer_express(x < y); // expected-warning {{$x + 1U < $x - 1U}}982}983 984void compare_same_symbol_minus_left_plus_right_int_less_unsigned(void) {985  unsigned x = f(), y = x + 1;986  clang_analyzer_denote(x, "$x");987  --x;988  clang_analyzer_express(x); // expected-warning {{$x - 1}}989  clang_analyzer_express(y); // expected-warning {{$x + 1}}990  clang_analyzer_express(x < y); // expected-warning {{$x - 1U < $x + 1U}}991}992 993void compare_same_symbol_minus_left_minus_right_int_less_unsigned(void) {994  unsigned x = f(), y = x - 1;995  clang_analyzer_denote(x, "$x");996  --x;997  clang_analyzer_express(x); // expected-warning {{$x - 1}}998  clang_analyzer_express(y); // expected-warning {{$x - 1}}999  clang_analyzer_eval(x < y); // expected-warning {{FALSE}}1000}1001 1002void overflow(signed char n, signed char m) {1003  if (n + 0 > m + 0) {1004    clang_analyzer_eval(n - 126 == m + 3); // expected-warning {{UNKNOWN}}1005  }1006}1007 1008int mixed_integer_types(int x, int y) {1009  short a = x - 1U;1010  return a - y;1011}1012 1013unsigned gu(void);1014unsigned fu(void) {1015  unsigned x = gu();1016  // Assert that no overflows occur in this test file.1017  // Assuming that concrete integers are also within that range.1018  assert(x <= ((unsigned)UINT_MAX / 4));1019  return x;1020}1021 1022void unsigned_concrete_int_no_crash(void) {1023  unsigned x = fu() + 1U, y = fu() + 1U;1024  clang_analyzer_denote(x - 1U, "$x");1025  clang_analyzer_denote(y - 1U, "$y");1026  clang_analyzer_express(y); // expected-warning {{$y}}1027  clang_analyzer_express(x == y); // expected-warning {{$x + 1U == $y + 1U}}1028}1029