Skip to content

Commit 2db0d28

Browse files
IOBYTERobert Reif
andauthored
fix daca crash in TemplateSimplifier::getNewName (cppcheck-opensource#2772)
Don't add the same template instantiation multiple times. Co-authored-by: Robert Reif <reif@FX6840>
1 parent 84dd0c9 commit 2db0d28

2 files changed

Lines changed: 218 additions & 1 deletion

File tree

lib/templatesimplifier.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,15 @@ void TemplateSimplifier::addInstantiation(Token *token, const std::string &scope
769769
{
770770
simplifyTemplateArgs(token->tokAt(2), token->next()->findClosingBracket());
771771

772-
mTemplateInstantiations.emplace_back(token, scope);
772+
TokenAndName instantiation(token, scope);
773+
774+
// check if instantiation already exists before adding it
775+
std::list<TokenAndName>::iterator it = std::find(mTemplateInstantiations.begin(),
776+
mTemplateInstantiations.end(),
777+
instantiation);
778+
779+
if (it == mTemplateInstantiations.end())
780+
mTemplateInstantiations.emplace_back(instantiation);
773781
}
774782

775783
void TemplateSimplifier::getTemplateInstantiations()

test/testsimplifytemplate.cpp

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ class TestSimplifyTemplate : public TestFixture {
197197
TEST_CASE(template155); // #9539
198198
TEST_CASE(template156);
199199
TEST_CASE(template157); // #9854
200+
TEST_CASE(template158); // daca crash
200201
TEST_CASE(template_specialization_1); // #7868 - template specialization template <typename T> struct S<C<T>> {..};
201202
TEST_CASE(template_specialization_2); // #7868 - template specialization template <typename T> struct S<C<T>> {..};
202203
TEST_CASE(template_enum); // #6299 Syntax error in complex enum declaration (including template)
@@ -3767,6 +3768,214 @@ class TestSimplifyTemplate : public TestFixture {
37673768
ASSERT_EQUALS(exp, tok(code));
37683769
}
37693770

3771+
void template158() { // daca crash
3772+
const char code[] = "template <typename> class a0{};\n"
3773+
"template <typename> class a1{};\n"
3774+
"template <typename> class a2{};\n"
3775+
"template <typename> class a3{};\n"
3776+
"template <typename> class a4{};\n"
3777+
"template <typename> class a5{};\n"
3778+
"template <typename> class a6{};\n"
3779+
"template <typename> class a7{};\n"
3780+
"template <typename> class a8{};\n"
3781+
"template <typename> class a9{};\n"
3782+
"template <typename> class a10{};\n"
3783+
"template <typename> class a11{};\n"
3784+
"template <typename> class a12{};\n"
3785+
"template <typename> class a13{};\n"
3786+
"template <typename> class a14{};\n"
3787+
"template <typename> class a15{};\n"
3788+
"template <typename> class a16{};\n"
3789+
"template <typename> class a17{};\n"
3790+
"template <typename> class a18{};\n"
3791+
"template <typename> class a19{};\n"
3792+
"template <typename> class a20{};\n"
3793+
"template <typename> class a21{};\n"
3794+
"template <typename> class a22{};\n"
3795+
"template <typename> class a23{};\n"
3796+
"template <typename> class a24{};\n"
3797+
"template <typename> class a25{};\n"
3798+
"template <typename> class a26{};\n"
3799+
"template <typename> class a27{};\n"
3800+
"template <typename> class a28{};\n"
3801+
"template <typename> class a29{};\n"
3802+
"template <typename> class a30{};\n"
3803+
"template <typename> class a31{};\n"
3804+
"template <typename> class a32{};\n"
3805+
"template <typename> class a33{};\n"
3806+
"template <typename> class a34{};\n"
3807+
"template <typename> class a35{};\n"
3808+
"template <typename> class a36{};\n"
3809+
"template <typename> class a37{};\n"
3810+
"template <typename> class a38{};\n"
3811+
"template <typename> class a39{};\n"
3812+
"template <typename> class a40{};\n"
3813+
"template <typename> class a41{};\n"
3814+
"template <typename> class a42{};\n"
3815+
"template <typename> class a43{};\n"
3816+
"template <typename> class a44{};\n"
3817+
"template <typename> class a45{};\n"
3818+
"template <typename> class a46{};\n"
3819+
"template <typename> class a47{};\n"
3820+
"template <typename> class a48{};\n"
3821+
"template <typename> class a49{};\n"
3822+
"template <typename> class a50{};\n"
3823+
"template <typename> class a51{};\n"
3824+
"template <typename> class a52{};\n"
3825+
"template <typename> class a53{};\n"
3826+
"template <typename> class a54{};\n"
3827+
"template <typename> class a55{};\n"
3828+
"template <typename> class a56{};\n"
3829+
"template <typename> class a57{};\n"
3830+
"template <typename> class a58{};\n"
3831+
"template <typename> class a59{};\n"
3832+
"template <typename> class a60{};\n"
3833+
"template <typename> class a61{};\n"
3834+
"template <typename> class a62{};\n"
3835+
"template <typename> class a63{};\n"
3836+
"template <typename> class a64{};\n"
3837+
"template <typename> class a65{};\n"
3838+
"template <typename> class a66{};\n"
3839+
"template <typename> class a67{};\n"
3840+
"template <typename> class a68{};\n"
3841+
"template <typename> class a69{};\n"
3842+
"template <typename> class a70{};\n"
3843+
"template <typename> class a71{};\n"
3844+
"template <typename> class a72{};\n"
3845+
"template <typename> class a73{};\n"
3846+
"template <typename> class a74{};\n"
3847+
"template <typename> class a75{};\n"
3848+
"template <typename> class a76{};\n"
3849+
"template <typename> class a77{};\n"
3850+
"template <typename> class a78{};\n"
3851+
"template <typename> class a79{};\n"
3852+
"template <typename> class a80{};\n"
3853+
"template <typename> class a81{};\n"
3854+
"template <typename> class a82{};\n"
3855+
"template <typename> class a83{};\n"
3856+
"template <typename> class a84{};\n"
3857+
"template <typename> class a85{};\n"
3858+
"template <typename> class a86{};\n"
3859+
"template <typename> class a87{};\n"
3860+
"template <typename> class a88{};\n"
3861+
"template <typename> class a89{};\n"
3862+
"template <typename> class a90{};\n"
3863+
"template <typename> class a91{};\n"
3864+
"template <typename> class a92{};\n"
3865+
"template <typename> class a93{};\n"
3866+
"template <typename> class a94{};\n"
3867+
"template <typename> class a95{};\n"
3868+
"template <typename> class a96{};\n"
3869+
"template <typename> class a97{};\n"
3870+
"template <typename> class a98{};\n"
3871+
"template <typename> class a99{};\n"
3872+
"template <typename> class a100{};\n"
3873+
"template <typename> class b {};\n"
3874+
"b<a0<int>> d0;\n"
3875+
"b<a1<int>> d1;\n"
3876+
"b<a2<int>> d2;\n"
3877+
"b<a3<int>> d3;\n"
3878+
"b<a4<int>> d4;\n"
3879+
"b<a5<int>> d5;\n"
3880+
"b<a6<int>> d6;\n"
3881+
"b<a7<int>> d7;\n"
3882+
"b<a8<int>> d8;\n"
3883+
"b<a9<int>> d9;\n"
3884+
"b<a10<int>> d10;\n"
3885+
"b<a11<int>> d11;\n"
3886+
"b<a12<int>> d12;\n"
3887+
"b<a13<int>> d13;\n"
3888+
"b<a14<int>> d14;\n"
3889+
"b<a15<int>> d15;\n"
3890+
"b<a16<int>> d16;\n"
3891+
"b<a17<int>> d17;\n"
3892+
"b<a18<int>> d18;\n"
3893+
"b<a19<int>> d19;\n"
3894+
"b<a20<int>> d20;\n"
3895+
"b<a21<int>> d21;\n"
3896+
"b<a22<int>> d22;\n"
3897+
"b<a23<int>> d23;\n"
3898+
"b<a24<int>> d24;\n"
3899+
"b<a25<int>> d25;\n"
3900+
"b<a26<int>> d26;\n"
3901+
"b<a27<int>> d27;\n"
3902+
"b<a28<int>> d28;\n"
3903+
"b<a29<int>> d29;\n"
3904+
"b<a30<int>> d30;\n"
3905+
"b<a31<int>> d31;\n"
3906+
"b<a32<int>> d32;\n"
3907+
"b<a33<int>> d33;\n"
3908+
"b<a34<int>> d34;\n"
3909+
"b<a35<int>> d35;\n"
3910+
"b<a36<int>> d36;\n"
3911+
"b<a37<int>> d37;\n"
3912+
"b<a38<int>> d38;\n"
3913+
"b<a39<int>> d39;\n"
3914+
"b<a40<int>> d40;\n"
3915+
"b<a41<int>> d41;\n"
3916+
"b<a42<int>> d42;\n"
3917+
"b<a43<int>> d43;\n"
3918+
"b<a44<int>> d44;\n"
3919+
"b<a45<int>> d45;\n"
3920+
"b<a46<int>> d46;\n"
3921+
"b<a47<int>> d47;\n"
3922+
"b<a48<int>> d48;\n"
3923+
"b<a49<int>> d49;\n"
3924+
"b<a50<int>> d50;\n"
3925+
"b<a51<int>> d51;\n"
3926+
"b<a52<int>> d52;\n"
3927+
"b<a53<int>> d53;\n"
3928+
"b<a54<int>> d54;\n"
3929+
"b<a55<int>> d55;\n"
3930+
"b<a56<int>> d56;\n"
3931+
"b<a57<int>> d57;\n"
3932+
"b<a58<int>> d58;\n"
3933+
"b<a59<int>> d59;\n"
3934+
"b<a60<int>> d60;\n"
3935+
"b<a61<int>> d61;\n"
3936+
"b<a62<int>> d62;\n"
3937+
"b<a63<int>> d63;\n"
3938+
"b<a64<int>> d64;\n"
3939+
"b<a65<int>> d65;\n"
3940+
"b<a66<int>> d66;\n"
3941+
"b<a67<int>> d67;\n"
3942+
"b<a68<int>> d68;\n"
3943+
"b<a69<int>> d69;\n"
3944+
"b<a70<int>> d70;\n"
3945+
"b<a71<int>> d71;\n"
3946+
"b<a72<int>> d72;\n"
3947+
"b<a73<int>> d73;\n"
3948+
"b<a74<int>> d74;\n"
3949+
"b<a75<int>> d75;\n"
3950+
"b<a76<int>> d76;\n"
3951+
"b<a77<int>> d77;\n"
3952+
"b<a78<int>> d78;\n"
3953+
"b<a79<int>> d79;\n"
3954+
"b<a80<int>> d80;\n"
3955+
"b<a81<int>> d81;\n"
3956+
"b<a82<int>> d82;\n"
3957+
"b<a83<int>> d83;\n"
3958+
"b<a84<int>> d84;\n"
3959+
"b<a85<int>> d85;\n"
3960+
"b<a86<int>> d86;\n"
3961+
"b<a87<int>> d87;\n"
3962+
"b<a88<int>> d88;\n"
3963+
"b<a89<int>> d89;\n"
3964+
"b<a90<int>> d90;\n"
3965+
"b<a91<int>> d91;\n"
3966+
"b<a92<int>> d92;\n"
3967+
"b<a93<int>> d93;\n"
3968+
"b<a94<int>> d94;\n"
3969+
"b<a95<int>> d95;\n"
3970+
"b<a96<int>> d96;\n"
3971+
"b<a97<int>> d97;\n"
3972+
"b<a98<int>> d98;\n"
3973+
"b<a99<int>> d99;\n"
3974+
"b<a100<int>> d100;";
3975+
// don't bother checking the output because this is not instantiated properly
3976+
tok(code); // don't crash
3977+
}
3978+
37703979
void template_specialization_1() { // #7868 - template specialization template <typename T> struct S<C<T>> {..};
37713980
const char code[] = "template <typename T> struct C {};\n"
37723981
"template <typename T> struct S {a};\n"

0 commit comments

Comments
 (0)