@@ -96,9 +96,9 @@ const ValueFlow::Value* ProgramMemory::getValue(nonneg int exprid, bool impossib
9696 return nullptr ;
9797}
9898
99- bool ProgramMemory::getIntValue (nonneg int exprid, MathLib::bigint& result) const
99+ bool ProgramMemory::getIntValue (nonneg int exprid, MathLib::bigint& result, bool impossible ) const
100100{
101- const ValueFlow::Value* value = getValue (exprid);
101+ const ValueFlow::Value* value = getValue (exprid, impossible );
102102 if (value && value->isIntValue ()) {
103103 result = value->intvalue ;
104104 return true ;
@@ -114,9 +114,9 @@ void ProgramMemory::setIntValue(const Token* expr, MathLib::bigint value, bool i
114114 setValue (expr, v);
115115}
116116
117- bool ProgramMemory::getTokValue (nonneg int exprid, const Token*& result) const
117+ bool ProgramMemory::getTokValue (nonneg int exprid, const Token*& result, bool impossible ) const
118118{
119- const ValueFlow::Value* value = getValue (exprid);
119+ const ValueFlow::Value* value = getValue (exprid, impossible );
120120 if (value && value->isTokValue ()) {
121121 result = value->tokvalue ;
122122 return true ;
@@ -125,18 +125,18 @@ bool ProgramMemory::getTokValue(nonneg int exprid, const Token*& result) const
125125}
126126
127127// cppcheck-suppress unusedFunction
128- bool ProgramMemory::getContainerSizeValue (nonneg int exprid, MathLib::bigint& result) const
128+ bool ProgramMemory::getContainerSizeValue (nonneg int exprid, MathLib::bigint& result, bool impossible ) const
129129{
130- const ValueFlow::Value* value = getValue (exprid);
130+ const ValueFlow::Value* value = getValue (exprid, impossible );
131131 if (value && value->isContainerSizeValue ()) {
132132 result = value->intvalue ;
133133 return true ;
134134 }
135135 return false ;
136136}
137- bool ProgramMemory::getContainerEmptyValue (nonneg int exprid, MathLib::bigint& result) const
137+ bool ProgramMemory::getContainerEmptyValue (nonneg int exprid, MathLib::bigint& result, bool impossible ) const
138138{
139- const ValueFlow::Value* value = getValue (exprid, true );
139+ const ValueFlow::Value* value = getValue (exprid, impossible );
140140 if (value && value->isContainerSizeValue ()) {
141141 if (value->isImpossible () && value->intvalue == 0 ) {
142142 result = false ;
@@ -165,25 +165,25 @@ void ProgramMemory::setUnknown(const Token* expr) {
165165 (*mValues )[expr].valueType = ValueFlow::Value::ValueType::UNINIT;
166166}
167167
168- bool ProgramMemory::hasValue (nonneg int exprid) const
168+ bool ProgramMemory::hasValue (nonneg int exprid, bool impossible ) const
169169{
170170 const auto it = find (exprid);
171- return it != mValues ->cend ();
171+ return it != mValues ->cend () && (impossible || !it-> second . isImpossible ()) ;
172172}
173173
174- const ValueFlow::Value& ProgramMemory::at (nonneg int exprid) const {
174+ const ValueFlow::Value& ProgramMemory::at (nonneg int exprid, bool impossible ) const {
175175 const auto it = find (exprid);
176- if (it == mValues ->cend ()) {
176+ if (it == mValues ->cend () && (impossible || !it-> second . isImpossible ()) ) {
177177 throw std::out_of_range (" ProgramMemory::at" );
178178 }
179179 return it->second ;
180180}
181181
182- ValueFlow::Value& ProgramMemory::at (nonneg int exprid) {
182+ ValueFlow::Value& ProgramMemory::at (nonneg int exprid, bool impossible ) {
183183 copyOnWrite ();
184184
185185 const auto it = find (exprid);
186- if (it == mValues ->end ()) {
186+ if (it == mValues ->end () && (impossible || !it-> second . isImpossible ()) ) {
187187 throw std::out_of_range (" ProgramMemory::at" );
188188 }
189189 return it->second ;
0 commit comments