Skip to content

Commit e444092

Browse files
and_condition_impl::combine_equal - Remove UB container modification. (#63)
* and_condition_impl::combine_equal - Remove UB container modification. The container is modified while iterating it. Switched to indexed based iteration to avoid UB. * Update condition.cpp Sorry missed this line.
1 parent a96b1e0 commit e444092

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

src/condition.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,27 +115,33 @@ namespace detail
115115
auto first = subs.front();
116116
auto &fc = first->m_sub;
117117

118-
for (auto c : fc)
118+
for (size_t fc_i = 0; fc_i < fc.size();)
119119
{
120-
if (not found_in_range(c, subs.begin() + 1, subs.end()))
120+
auto c = fc[fc_i];
121+
if (not found_in_range(c, subs.begin() + 1, subs.end())) {
122+
++fc_i;
121123
continue;
124+
}
122125

123126
if (and_result == nullptr)
124127
and_result = new and_condition_impl();
125128

126129
and_result->m_sub.push_back(c);
127-
fc.erase(remove(fc.begin(), fc.end(), c), fc.end());
130+
fc.erase(fc.begin() + fc_i);
128131

129132
for (auto sub : subs)
130133
{
131134
auto &ssub = sub->m_sub;
132135

133-
for (auto sc : ssub)
136+
for (size_t ssub_i = 0; ssub_i < ssub.size();)
134137
{
135-
if (not sc->equals(c))
138+
auto sc = ssub[ssub_i];
139+
if (not sc->equals(c)) {
140+
++ssub_i;
136141
continue;
142+
}
137143

138-
ssub.erase(remove(ssub.begin(), ssub.end(), sc), ssub.end());
144+
ssub.erase(ssub.begin() + ssub_i);
139145
delete sc;
140146
break;
141147
}

0 commit comments

Comments
 (0)