170 lines · c
1// RUN: %clang_analyze_cc1 -triple=x86_64-unknown-linux-gnu -analyzer-checker=core,apiModeling,debug.ExprInspection -analyzer-config eagerly-assume=false -verify %s2 3void clang_analyzer_dump(int);4void clang_analyzer_dumpL(long);5void clang_analyzer_warnIfReached();6 7void testInspect(int x) {8 if ((x < 10) || (x > 100)) {9 return;10 }11 // x: [10, 100]12 13 int i = x + 1;14 long l = i - 10U;15 clang_analyzer_dump(i); // expected-warning-re {{(reg_${{[0-9]+}}<int x>) + 1 }}16 clang_analyzer_dumpL(l); // expected-warning-re {{(reg_${{[0-9]+}}<int x>) - 9U }} instead of + 4294967287U17 clang_analyzer_dumpL(l + 0L); // expected-warning-re {{(reg_${{[0-9]+}}<int x>) - 9 }} instead of + 429496728718 19 if ((l - 1000) > 0) {20 clang_analyzer_warnIfReached(); // no-warning21 }22 if (l > 1000) {23 clang_analyzer_warnIfReached(); // no-warning24 }25 if (l > 1000L) {26 clang_analyzer_warnIfReached(); // no-warning27 }28 if ((l + 0L) > 1000) {29 clang_analyzer_warnIfReached(); // no-warning30 }31 32 i = x - 1;33 l = i + 10U;34 clang_analyzer_dumpL(l); // expected-warning-re {{(reg_${{[0-9]+}}<int x>) + 9U }} instead of - 4294967287U35 36 i = x + (-1);37 l = i - 10U;38 clang_analyzer_dumpL(l); // expected-warning-re {{(reg_${{[0-9]+}}<int x>) - 11U }} instead of + 4294967285U39 40 i = x + 1U;41 l = i - 10U;42 clang_analyzer_dumpL(l); // expected-warning-re {{(reg_${{[0-9]+}}<int x>) - 9U }} instead of + 4294967287U43}44 45const int intMin = 1 << (sizeof(int) * 8 - 1); // INT_MIN, negation value is not representable46const long longMin = 1L << (sizeof(long) * 8 - 1); // LONG_MIN, negation value is not representable47 48void testMin(int i, long l) {49 clang_analyzer_dump(i + (-1)); // expected-warning-re {{(reg_${{[0-9]+}}<int i>) - 1 }} instead of + -150 clang_analyzer_dump(i - (-1)); // expected-warning-re {{(reg_${{[0-9]+}}<int i>) + 1 }} instead of - -151 clang_analyzer_dumpL(l + (-1)); // expected-warning-re {{(reg_${{[0-9]+}}<long l>) - 1 }} instead of + -152 clang_analyzer_dumpL(l - (-1)); // expected-warning-re {{(reg_${{[0-9]+}}<long l>) + 1 }} instead of - -153 54 // Do not normalize representation if negation would not be representable55 clang_analyzer_dump(i + intMin); // expected-warning-re {{(reg_${{[0-9]+}}<int i>) + -2147483648 }} no change56 clang_analyzer_dump(i - intMin); // expected-warning-re {{(reg_${{[0-9]+}}<int i>) - -2147483648 }} no change57 // Produced value has higher bit with (long) so negation if representable58 clang_analyzer_dumpL(l + intMin); // expected-warning-re {{(reg_${{[0-9]+}}<long l>) - 2147483648 }} instead of + -214748364859 clang_analyzer_dumpL(l - intMin); // expected-warning-re {{(reg_${{[0-9]+}}<long l>) + 2147483648 }} instead of - -214748364860}61 62void changingToUnsigned(unsigned u, int i) {63 unsigned c = u + (unsigned)i;64 unsigned d = u - (unsigned)i;65 if (i == -1) {66 clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned int u>) - 1U }}67 clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned int u>) + 1U }}68 return;69 }70 if (i == intMin) {71 clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned int u>) - 2147483648U }}72 clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned int u>) + 2147483648U }}73 return;74 }75}76 77void extendingToSigned(long l, int i) {78 long c = l + (long)i;79 long d = l - (long)i;80 if (i == -1) {81 clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}<long l>) - 1 }}82 clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}<long l>) + 1 }}83 return;84 }85 if (i == intMin) {86 clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}<long l>) - 2147483648 }}87 clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}<long l>) + 2147483648 }}88 return;89 }90}91 92void extendingToUnsigned(unsigned long ul, int i) {93 unsigned long c = ul + (unsigned long)i;94 unsigned long d = ul - (unsigned long)i;95 if (i == -1) {96 clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned long ul>) - 1U }}97 clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned long ul>) + 1U }}98 return;99 }100 if (i == intMin) {101 clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned long ul>) - 2147483648U }}102 clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned long ul>) + 2147483648U }}103 return;104 }105}106 107void truncatingToSigned(int i, long l) {108 int c = i + (int)l;109 int d = i - (int)l;110 if (l == -1L) {111 clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}<int i>) - 1 }}112 clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}<int i>) + 1 }}113 return;114 }115 if (l == (long)intMin) { // negation outside of range, no-changes116 clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}<int i>) + -2147483648 }}117 clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}<int i>) + -2147483648 }}118 return;119 }120 if (l == ((long)intMin - 1L)) { // outside or range, no changes121 clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}<int i>) + 2147483647 }}122 clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}<int i>) - 2147483647 }}123 return;124 }125 if (l == longMin) { // outside of range, no changes126 clang_analyzer_dump(c + 0); // expected-warning-re {{reg_${{[0-9]+}}<int i> }}127 clang_analyzer_dump(d + 0); // expected-warning-re {{reg_${{[0-9]+}}<int i> }}128 return;129 }130}131 132void truncatingToUnsigned(unsigned u, long l) {133 unsigned c = u + (unsigned)l;134 unsigned d = u - (unsigned)l;135 if (l == -1L) {136 clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned int u>) - 1U }}137 clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned int u>) + 1U }}138 return;139 }140 if (l == (long)intMin) {141 clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned int u>) - 2147483648U }}142 clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned int u>) + 2147483648U }}143 return;144 }145 if (l == ((long)intMin - 1L)) { // outside or range, no changes146 clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned int u>) + 2147483647U }}147 clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}<unsigned int u>) - 2147483647U }}148 return;149 }150 if (l == longMin) { // outside of range, no changes151 clang_analyzer_dump(c + 0); // expected-warning-re {{reg_${{[0-9]+}}<unsigned int u> }}152 clang_analyzer_dump(d + 0); // expected-warning-re {{reg_${{[0-9]+}}<unsigned int u> }}153 return;154 }155}156 157// Test for crashes158typedef long ssize_t;159ssize_t write(int, const void *, unsigned long);160 161int crashTest(int x, int fd) {162 unsigned wres = write(fd, "a", 1);163 if (wres) {164 }165 int t1 = x - wres;166 if (wres < 0) {167 }168 return x + t1; // no crash169}170