Skip to content

Commit 4c91664

Browse files
committed
Ticket cppcheck-opensource#6347: Fix use after delete when simplifying template instantiations.
1 parent 42c4aa1 commit 4c91664

2 files changed

Lines changed: 13 additions & 3 deletions

File tree

lib/templatesimplifier.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,8 +1052,8 @@ bool TemplateSimplifier::simplifyCalculations(Token *_tokens)
10521052
ret = true;
10531053
} else if (Token::Match(tok->previous(), "[=([,] 0 [+|]") ||
10541054
Token::Match(tok->previous(), "return|case 0 [+|]")) {
1055-
tok->deleteNext();
1056-
tok->deleteThis();
1055+
tok = tok->previous();
1056+
tok->deleteNext(2);
10571057
ret = true;
10581058
} else if (Token::Match(tok->previous(), "[=[(,] 0 * %name% ,|]|)|;|=|%cop%") ||
10591059
Token::Match(tok->previous(), "[=[(,] 0 * %num% ,|]|)|;|%op%") ||
@@ -1232,7 +1232,6 @@ bool TemplateSimplifier::simplifyTemplateInstantiations(
12321232
break;
12331233
}
12341234
}
1235-
12361235
Token * const tok2 = *iter2;
12371236
if (tok2->str() != name)
12381237
continue;

test/testsimplifytemplate.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class TestSimplifyTemplate : public TestFixture {
8282
TEST_CASE(template49); // #6237 - template instantiation
8383
TEST_CASE(template50); // #4272 - simple partial specialization
8484
TEST_CASE(template51); // #6172 - crash upon valid code
85+
TEST_CASE(template52); // #6437 - crash upon valid code
8586
TEST_CASE(template_unhandled);
8687
TEST_CASE(template_default_parameter);
8788
TEST_CASE(template_default_type);
@@ -927,6 +928,16 @@ class TestSimplifyTemplate : public TestFixture {
927928
"}");
928929
}
929930

931+
void template52() { // #6437
932+
tok("template <int value> int sum() { "
933+
" return value + sum<value/2>(); "
934+
"} "
935+
"template<int x, int y> int calculate_value() { "
936+
" return sum<x - y>(); "
937+
"} "
938+
"int value = calculate_value<1,1>();");
939+
}
940+
930941
void template_default_parameter() {
931942
{
932943
const char code[] = "template <class T, int n=3>\n"

0 commit comments

Comments
 (0)