MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / valueFlowCalculations

Method valueFlowCalculations

test/testvalueflow.cpp:1082–1370  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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"

Callers

nothing calls this directly

Calls 5

removeImpossibleFunction · 0.85
frontMethod · 0.80
isKnownMethod · 0.80
emptyMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected