20
20
21
21
#include " astutils.h"
22
22
#include " infer.h"
23
- #include " mathlib.h"
24
23
#include " symboldatabase.h"
25
24
#include " token.h"
26
25
#include " valueptr.h"
27
26
#include " vfvalue.h"
28
27
29
28
#include " vf_settokenvalue.h"
30
29
31
- #include < cassert>
32
30
#include < utility>
33
31
#include < vector>
34
32
35
33
namespace ValueFlow
36
34
{
37
- struct SymbolicInferModel : InferModel {
38
- const Token* expr;
39
- explicit SymbolicInferModel (const Token* tok) : expr(tok) {
40
- assert (expr->exprId () != 0 );
41
- }
42
- bool match (const Value& value) const override
43
- {
44
- return value.isSymbolicValue () && value.tokvalue && value.tokvalue ->exprId () == expr->exprId ();
45
- }
46
- Value yield (MathLib::bigint value) const override
47
- {
48
- Value result (value);
49
- result.valueType = Value::ValueType::SYMBOLIC;
50
- result.tokvalue = expr;
51
- result.setKnown ();
52
- return result;
53
- }
54
- };
55
-
56
35
void valueFlowSymbolicInfer (const SymbolDatabase& symboldatabase, const Settings& settings)
57
36
{
58
37
for (const Scope* scope : symboldatabase.functionScopes ) {
@@ -78,10 +57,10 @@ namespace ValueFlow
78
57
if (astIsFloat (tok->astOperand2 (), false ))
79
58
continue ;
80
59
81
- SymbolicInferModel leftModel{ tok->astOperand1 ()} ;
60
+ auto leftModel = makeSymbolicInferModel ( tok->astOperand1 ()) ;
82
61
std::vector<Value> values = infer (leftModel, tok->str (), 0 , tok->astOperand2 ()->values ());
83
62
if (values.empty ()) {
84
- SymbolicInferModel rightModel{ tok->astOperand2 ()} ;
63
+ auto rightModel = makeSymbolicInferModel ( tok->astOperand2 ()) ;
85
64
values = infer (rightModel, tok->str (), tok->astOperand1 ()->values (), 0 );
86
65
}
87
66
for (Value& value : values) {
0 commit comments