| 1080 | } |
| 1081 | |
| 1082 | void valueFlowCalculations() { |
| 1083 | const char *code; |
| 1084 | |
| 1085 | // Different operators |
| 1086 | ASSERT_EQUALS(5, valueOfTok("3 + (a ? b : 2);", "+").intvalue); |
| 1087 | ASSERT_EQUALS(1, valueOfTok("3 - (a ? b : 2);", "-").intvalue); |
| 1088 | ASSERT_EQUALS(6, valueOfTok("3 * (a ? b : 2);", "*").intvalue); |
| 1089 | ASSERT_EQUALS(6, valueOfTok("13 / (a ? b : 2);", "/").intvalue); |
| 1090 | ASSERT_EQUALS(1, valueOfTok("13 % (a ? b : 2);", "%").intvalue); |
| 1091 | ASSERT_EQUALS(0, valueOfTok("3 == (a ? b : 2);", "==").intvalue); |
| 1092 | ASSERT_EQUALS(1, valueOfTok("3 != (a ? b : 2);", "!=").intvalue); |
| 1093 | ASSERT_EQUALS(1, valueOfTok("3 > (a ? b : 2);", ">").intvalue); |
| 1094 | ASSERT_EQUALS(1, valueOfTok("3 >= (a ? b : 2);", ">=").intvalue); |
| 1095 | ASSERT_EQUALS(0, valueOfTok("3 < (a ? b : 2);", "<").intvalue); |
| 1096 | ASSERT_EQUALS(0, valueOfTok("3 <= (a ? b : 2);", "<=").intvalue); |
| 1097 | |
| 1098 | ASSERT_EQUALS(1, valueOfTok("(UNKNOWN_TYPE)1;","(").intvalue); |
| 1099 | ASSERT(tokenValues("(UNKNOWN_TYPE)1000;","(").empty()); // don't know if there is truncation, sign extension |
| 1100 | ASSERT_EQUALS(255, valueOfTok("(unsigned char)~0;", "(").intvalue); |
| 1101 | ASSERT_EQUALS(0, valueOfTok("(int)0;", "(").intvalue); |
| 1102 | ASSERT_EQUALS(3, valueOfTok("(int)(1+2);", "(").intvalue); |
| 1103 | ASSERT_EQUALS(0, valueOfTok("(UNKNOWN_TYPE*)0;","(").intvalue); |
| 1104 | ASSERT_EQUALS(100, valueOfTok("(int)100.0;", "(").intvalue); |
| 1105 | ASSERT_EQUALS(10, valueOfTok("x = static_cast<int>(10);", "( 10 )").intvalue); |
| 1106 | ASSERT_EQUALS(0, valueOfTok("x = sizeof (struct {int a;}) * 0;", "*").intvalue); |
| 1107 | |
| 1108 | // Don't calculate or crash if there is UB or invalid operations |
| 1109 | ASSERT(tokenValues(";-1<<10;","<<").empty()); |
| 1110 | ASSERT(tokenValues(";10<<-1;","<<").empty()); |
| 1111 | ASSERT(tokenValues(";10<<64;","<<").empty()); |
| 1112 | ASSERT(tokenValues(";-1>>10;",">>").empty()); |
| 1113 | ASSERT(tokenValues(";10>>-1;",">>").empty()); |
| 1114 | ASSERT(tokenValues(";10>>64;",">>").empty()); |
| 1115 | ASSERT_EQUALS(tokenValues(";1%-1;","%").size(), 1); |
| 1116 | ASSERT_EQUALS(tokenValues(";1%-10;","%").size(), 1); |
| 1117 | ASSERT_EQUALS(tokenValues(";1.5%-1;","%").size(), 1); |
| 1118 | ASSERT_EQUALS(tokenValues(";1.5%-10;","%").size(), 1); |
| 1119 | ASSERT(tokenValues(";1%-1.5;","%").empty()); |
| 1120 | ASSERT(tokenValues(";1%-10.5;","%").empty()); |
| 1121 | ASSERT(tokenValues(";1.5%-1.5;","%").empty()); |
| 1122 | ASSERT(tokenValues(";1.5%-10.5;","%").empty()); |
| 1123 | ASSERT(tokenValues(";1/-1;","/").empty()); |
| 1124 | ASSERT(tokenValues(";1/-10;","/").empty()); |
| 1125 | ASSERT(tokenValues(";1.5/-1;","/").empty()); |
| 1126 | ASSERT(tokenValues(";1.5/-10;","/").empty()); |
| 1127 | ASSERT(tokenValues(";1/-1.5;","/").empty()); |
| 1128 | ASSERT(tokenValues(";1/-10.5;","/").empty()); |
| 1129 | ASSERT(tokenValues(";1.5/-1.5;","/").empty()); |
| 1130 | ASSERT(tokenValues(";1.5/-10.5;","/").empty()); |
| 1131 | ASSERT(tokenValues(";1/0;","/").empty()); |
| 1132 | ASSERT(tokenValues(";1/0;","/").empty()); |
| 1133 | ASSERT(tokenValues(";1.5/0;","/").empty()); |
| 1134 | ASSERT(tokenValues(";1.5/0;","/").empty()); |
| 1135 | ASSERT(tokenValues(";((-1) * 9223372036854775807LL - 1) / (-1);", "/").empty()); // #12109 |
| 1136 | ASSERT_EQUALS(tokenValues(";((-1) * 9223372036854775807LL - 1) % (-1);", "%").size(), 1); // #12109 |
| 1137 | |
| 1138 | code = "float f(const uint16_t& value) {\n" |
| 1139 | " const uint16_t uVal = value; \n" |
nothing calls this directly
no test coverage detected