|
105 | 105 | #include "valueptr.h" |
106 | 106 | #include "vfvalue.h" |
107 | 107 |
|
108 | | -#include "vf_analyze.h" |
109 | 108 | #include "vf_analyzers.h" |
110 | 109 | #include "vf_common.h" |
111 | 110 | #include "vf_settokenvalue.h" |
@@ -555,6 +554,31 @@ size_t ValueFlow::getSizeOf(const ValueType &vt, const Settings &settings, int m |
555 | 554 | return 0; |
556 | 555 | } |
557 | 556 |
|
| 557 | +static void valueFlowNumber(TokenList &tokenlist, const Settings& settings) |
| 558 | +{ |
| 559 | + for (Token *tok = tokenlist.front(); tok;) { |
| 560 | + tok = ValueFlow::valueFlowSetConstantValue(tok, settings); |
| 561 | + } |
| 562 | + |
| 563 | + if (tokenlist.isCPP() || settings.standards.c >= Standards::C23) { |
| 564 | + for (Token *tok = tokenlist.front(); tok; tok = tok->next()) { |
| 565 | + if (tok->isName() && !tok->varId() && Token::Match(tok, "false|true")) { |
| 566 | + ValueFlow::Value value(tok->str() == "true"); |
| 567 | + if (!tok->isTemplateArg()) |
| 568 | + value.setKnown(); |
| 569 | + setTokenValue(tok, std::move(value), settings); |
| 570 | + } else if (Token::Match(tok, "[(,] NULL [,)]")) { |
| 571 | + // NULL function parameters are not simplified in the |
| 572 | + // normal tokenlist |
| 573 | + ValueFlow::Value value(0); |
| 574 | + if (!tok->isTemplateArg()) |
| 575 | + value.setKnown(); |
| 576 | + setTokenValue(tok->next(), std::move(value), settings); |
| 577 | + } |
| 578 | + } |
| 579 | + } |
| 580 | +} |
| 581 | + |
558 | 582 | static void valueFlowString(TokenList& tokenlist, const Settings& settings) |
559 | 583 | { |
560 | 584 | for (Token* tok = tokenlist.front(); tok; tok = tok->next()) { |
@@ -1113,6 +1137,33 @@ static void valueFlowImpossibleValues(TokenList& tokenList, const Settings& sett |
1113 | 1137 | } |
1114 | 1138 | } |
1115 | 1139 |
|
| 1140 | +static void valueFlowEnumValue(SymbolDatabase & symboldatabase, const Settings & settings) |
| 1141 | +{ |
| 1142 | + for (Scope & scope : symboldatabase.scopeList) { |
| 1143 | + if (scope.type != Scope::eEnum) |
| 1144 | + continue; |
| 1145 | + MathLib::bigint value = 0; |
| 1146 | + bool prev_enum_is_known = true; |
| 1147 | + |
| 1148 | + for (Enumerator & enumerator : scope.enumeratorList) { |
| 1149 | + if (enumerator.start) { |
| 1150 | + auto* rhs = const_cast<Token*>(enumerator.start->previous()->astOperand2()); |
| 1151 | + ValueFlow::valueFlowConstantFoldAST(rhs, settings); |
| 1152 | + if (rhs && rhs->hasKnownIntValue()) { |
| 1153 | + enumerator.value = rhs->values().front().intvalue; |
| 1154 | + enumerator.value_known = true; |
| 1155 | + value = enumerator.value + 1; |
| 1156 | + prev_enum_is_known = true; |
| 1157 | + } else |
| 1158 | + prev_enum_is_known = false; |
| 1159 | + } else if (prev_enum_is_known) { |
| 1160 | + enumerator.value = value++; |
| 1161 | + enumerator.value_known = true; |
| 1162 | + } |
| 1163 | + } |
| 1164 | + } |
| 1165 | +} |
| 1166 | + |
1116 | 1167 | static void valueFlowGlobalConstVar(TokenList& tokenList, const Settings& settings) |
1117 | 1168 | { |
1118 | 1169 | // Get variable values... |
@@ -7164,13 +7215,13 @@ void ValueFlow::setValues(TokenList& tokenlist, |
7164 | 7215 |
|
7165 | 7216 | ValueFlowPassRunner runner{ValueFlowState{tokenlist, symboldatabase, errorLogger, settings}, timerResults}; |
7166 | 7217 | runner.run_once({ |
7167 | | - VFA(analyzeEnumValue(symboldatabase, settings)), |
7168 | | - VFA(analyzeNumber(tokenlist, settings)), |
| 7218 | + VFA(valueFlowEnumValue(symboldatabase, settings)), |
| 7219 | + VFA(valueFlowNumber(tokenlist, settings)), |
7169 | 7220 | VFA(valueFlowString(tokenlist, settings)), |
7170 | 7221 | VFA(valueFlowArray(tokenlist, settings)), |
7171 | 7222 | VFA(valueFlowUnknownFunctionReturn(tokenlist, settings)), |
7172 | 7223 | VFA(valueFlowGlobalConstVar(tokenlist, settings)), |
7173 | | - VFA(analyzeEnumValue(symboldatabase, settings)), |
| 7224 | + VFA(valueFlowEnumValue(symboldatabase, settings)), |
7174 | 7225 | VFA(valueFlowGlobalStaticVar(tokenlist, settings)), |
7175 | 7226 | VFA(valueFlowPointerAlias(tokenlist, settings)), |
7176 | 7227 | VFA(valueFlowLifetime(tokenlist, errorLogger, settings)), |
|
0 commit comments