From e798e72252249902523e48e5d61625eda590d5d3 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 5 Jun 2023 00:10:36 +0200 Subject: [PATCH 01/16] Handle combined action/yield --- lib/library.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/library.cpp b/lib/library.cpp index 2f7c6e0dc..917a989cb 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -1360,11 +1360,9 @@ Library::UseRetValType Library::getUseRetValType(const Token *ftok) const { if (Token::simpleMatch(ftok->astParent(), ".")) { using Yield = Library::Container::Yield; - using Action = Library::Container::Action; const Yield yield = astContainerYield(ftok->astParent()->astOperand1()); - if (yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR || yield == Yield::AT_INDEX || - yield == Yield::SIZE || yield == Yield::EMPTY || yield == Yield::BUFFER || yield == Yield::BUFFER_NT || - ((yield == Yield::ITEM || yield == Yield::ITERATOR) && astContainerAction(ftok->astParent()->astOperand1()) == Action::NO_ACTION)) + if (yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR || yield == Yield::SIZE || yield == Yield::EMPTY || + (yield == Yield::ITEM && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION)) return Library::UseRetValType::DEFAULT; } if (isNotLibraryFunction(ftok)) From 605ff520b97461b668b819367adaf03f0cc01c43 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 5 Jun 2023 00:29:47 +0200 Subject: [PATCH 02/16] Add Yield::BUFFER --- lib/library.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/library.cpp b/lib/library.cpp index 917a989cb..30ae1760a 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -1361,7 +1361,8 @@ Library::UseRetValType Library::getUseRetValType(const Token *ftok) const if (Token::simpleMatch(ftok->astParent(), ".")) { using Yield = Library::Container::Yield; const Yield yield = astContainerYield(ftok->astParent()->astOperand1()); - if (yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR || yield == Yield::SIZE || yield == Yield::EMPTY || + if (yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR || + yield == Yield::SIZE || yield == Yield::EMPTY || yield == Yield::BUFFER || yield == Yield::BUFFER_NT || (yield == Yield::ITEM && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION)) return Library::UseRetValType::DEFAULT; } From 3f0999b01556c1a35357b49a44e8e7a83329a4c5 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 5 Jun 2023 00:34:23 +0200 Subject: [PATCH 03/16] Remove redundant functions --- cfg/std.cfg | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/cfg/std.cfg b/cfg/std.cfg index cd84c30c0..66bda9ca2 100644 --- a/cfg/std.cfg +++ b/cfg/std.cfg @@ -6676,12 +6676,6 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - - - - - false - @@ -6969,12 +6963,6 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun 0: - - - - - false - From ac87c1174c5be57e5846051b66ac1fc87b17c9e7 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 5 Jun 2023 00:55:55 +0200 Subject: [PATCH 04/16] Revert "Remove redundant functions" This reverts commit 4f124a57de5c761ac757ebed83d9f047ef4a1328. --- cfg/std.cfg | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cfg/std.cfg b/cfg/std.cfg index 66bda9ca2..cd84c30c0 100644 --- a/cfg/std.cfg +++ b/cfg/std.cfg @@ -6676,6 +6676,12 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun + + + + + false + @@ -6963,6 +6969,12 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun 0: + + + + + false + From c609ef88144e85efd5e4880ad484b41fe7c19fe2 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 5 Jun 2023 01:11:26 +0200 Subject: [PATCH 05/16] Add Yield::AT_INDEX --- lib/library.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/library.cpp b/lib/library.cpp index 30ae1760a..92e05e366 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -1361,7 +1361,7 @@ Library::UseRetValType Library::getUseRetValType(const Token *ftok) const if (Token::simpleMatch(ftok->astParent(), ".")) { using Yield = Library::Container::Yield; const Yield yield = astContainerYield(ftok->astParent()->astOperand1()); - if (yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR || + if (yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR || yield == Yield::AT_INDEX || yield == Yield::SIZE || yield == Yield::EMPTY || yield == Yield::BUFFER || yield == Yield::BUFFER_NT || (yield == Yield::ITEM && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION)) return Library::UseRetValType::DEFAULT; From 220ad27fa8f325c3466dea03684119ccb31c5d22 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 5 Jun 2023 01:13:28 +0200 Subject: [PATCH 06/16] Add Yield::ITERATOR --- lib/library.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/library.cpp b/lib/library.cpp index 92e05e366..0f21a415f 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -1363,7 +1363,8 @@ Library::UseRetValType Library::getUseRetValType(const Token *ftok) const const Yield yield = astContainerYield(ftok->astParent()->astOperand1()); if (yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR || yield == Yield::AT_INDEX || yield == Yield::SIZE || yield == Yield::EMPTY || yield == Yield::BUFFER || yield == Yield::BUFFER_NT || - (yield == Yield::ITEM && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION)) + (yield == Yield::ITEM && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION) || + (yield == Yield::ITERATOR && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION)) return Library::UseRetValType::DEFAULT; } if (isNotLibraryFunction(ftok)) From 022fcb3be159b6b14047b8e93cabb73b16dacc0c Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 5 Jun 2023 22:12:30 +0200 Subject: [PATCH 07/16] Handle const, noreturn, return type --- cfg/std.cfg | 29 ++++------------------------- lib/library.cpp | 24 ++++++++++++++++++++++++ lib/library.h | 11 +++++++++-- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/cfg/std.cfg b/cfg/std.cfg index cd84c30c0..59673e1d4 100644 --- a/cfg/std.cfg +++ b/cfg/std.cfg @@ -6600,15 +6600,6 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - - - - - - - - false - @@ -6676,12 +6667,6 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - - - - - false - @@ -6969,12 +6954,6 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun 0: - - - - - false - @@ -8589,8 +8568,8 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init - - + + @@ -8640,7 +8619,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init - + @@ -8757,7 +8736,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init - + diff --git a/lib/library.cpp b/lib/library.cpp index 0f21a415f..dcc51f392 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -484,6 +484,10 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc) return Error(ErrorCode::BAD_ATTRIBUTE_VALUE, yieldName); } + const char* const returnType = functionNode->Attribute("returnType"); + if (returnType) + container.functions[functionName].returnType = returnType; + container.functions[functionName].action = action; container.functions[functionName].yield = yield; } @@ -905,6 +909,10 @@ Library::Error Library::loadFunction(const tinyxml2::XMLElement * const node, co return Error(ErrorCode::BAD_ATTRIBUTE_VALUE, yieldName); } func.containerYield = yield; + + const char* const returnType = functionnode->Attribute("returnType"); + if (returnType) + func.returnType = returnType; } else unknown_elements.insert(functionnodename); } @@ -1385,6 +1393,11 @@ const std::string& Library::returnValue(const Token *ftok) const const std::string& Library::returnValueType(const Token *ftok) const { + if (Token::simpleMatch(ftok->astParent(), ".") && ftok->astParent()->astOperand1()) { + const Token* contTok = ftok->astParent()->astOperand1(); + if (contTok->valueType() && contTok->valueType()->container) + return contTok->valueType()->container->getReturnType(ftok->str()); + } if (isNotLibraryFunction(ftok)) return emptyString; const std::map::const_iterator it = mReturnValueType.find(getFunctionName(ftok)); @@ -1479,6 +1492,12 @@ bool Library::isFunctionConst(const Token *ftok) const { if (ftok->function() && ftok->function()->isConst()) return true; + if (Token::simpleMatch(ftok->astParent(), ".")) { + using Yield = Library::Container::Yield; + const Yield yield = astContainerYield(ftok->astParent()->astOperand1()); + if (yield == Yield::EMPTY || yield == Yield::SIZE || yield == Yield::BUFFER_NT) + return true; + } if (isNotLibraryFunction(ftok)) return false; const std::unordered_map::const_iterator it = functions.find(getFunctionName(ftok)); @@ -1489,6 +1508,11 @@ bool Library::isnoreturn(const Token *ftok) const { if (ftok->function() && ftok->function()->isAttributeNoreturn()) return true; + if (Token::simpleMatch(ftok->astParent(), ".")) { + if (astContainerAction(ftok->astParent()->astOperand1()) != Library::Container::Action::NO_ACTION || + astContainerYield(ftok->astParent()->astOperand1()) != Library::Container::Yield::NO_YIELD) + return false; + } if (isNotLibraryFunction(ftok)) return false; const std::unordered_map::const_iterator it = mNoReturn.find(getFunctionName(ftok)); diff --git a/lib/library.h b/lib/library.h index 306f86ac6..cbc2e0469 100644 --- a/lib/library.h +++ b/lib/library.h @@ -249,8 +249,9 @@ public: NO_YIELD }; struct Function { - Action action; - Yield yield; + Action action = Action::NO_ACTION; + Yield yield = Yield::NO_YIELD; + std::string returnType; }; struct RangeItemRecordTypeItem { std::string name; @@ -284,6 +285,11 @@ public: return Yield::NO_YIELD; } + const std::string& getReturnType(const std::string& function) const { + auto i = functions.find(function); + return (i != functions.end()) ? i->second.returnType : emptyString; + } + static Yield yieldFrom(const std::string& yieldName); static Action actionFrom(const std::string& actionName); }; @@ -359,6 +365,7 @@ public: bool formatstr_secure; Container::Action containerAction; Container::Yield containerYield; + std::string returnType; Function() : use(false), leakignore(false), From 55f34e2681ccbe4e4bf1c38baca4a0558b289c19 Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 7 Jun 2023 17:42:42 +0200 Subject: [PATCH 08/16] Extend XML schema --- cfg/cppcheck-cfg.rng | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cfg/cppcheck-cfg.rng b/cfg/cppcheck-cfg.rng index 4949ef15c..004e931b4 100644 --- a/cfg/cppcheck-cfg.rng +++ b/cfg/cppcheck-cfg.rng @@ -498,6 +498,11 @@ + + + + + From 68a59830a480096cfd58e2f2af3947fe53892da9 Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 7 Jun 2023 17:49:45 +0200 Subject: [PATCH 09/16] Fix returnValueType() --- lib/library.cpp | 62 ++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/lib/library.cpp b/lib/library.cpp index dcc51f392..14d1d2bdd 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -1366,17 +1366,18 @@ const Library::NonOverlappingData* Library::getNonOverlappingData(const Token *f Library::UseRetValType Library::getUseRetValType(const Token *ftok) const { - if (Token::simpleMatch(ftok->astParent(), ".")) { - using Yield = Library::Container::Yield; - const Yield yield = astContainerYield(ftok->astParent()->astOperand1()); - if (yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR || yield == Yield::AT_INDEX || - yield == Yield::SIZE || yield == Yield::EMPTY || yield == Yield::BUFFER || yield == Yield::BUFFER_NT || - (yield == Yield::ITEM && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION) || - (yield == Yield::ITERATOR && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION)) - return Library::UseRetValType::DEFAULT; - } - if (isNotLibraryFunction(ftok)) + if (isNotLibraryFunction(ftok)) { + if (Token::simpleMatch(ftok->astParent(), ".")) { + using Yield = Library::Container::Yield; + const Yield yield = astContainerYield(ftok->astParent()->astOperand1()); + if (yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR || yield == Yield::AT_INDEX || + yield == Yield::SIZE || yield == Yield::EMPTY || yield == Yield::BUFFER || yield == Yield::BUFFER_NT || + (yield == Yield::ITEM && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION) || + (yield == Yield::ITERATOR && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION)) + return Library::UseRetValType::DEFAULT; + } return Library::UseRetValType::NONE; + } const std::unordered_map::const_iterator it = functions.find(getFunctionName(ftok)); if (it != functions.cend()) return it->second.useretval; @@ -1393,13 +1394,14 @@ const std::string& Library::returnValue(const Token *ftok) const const std::string& Library::returnValueType(const Token *ftok) const { - if (Token::simpleMatch(ftok->astParent(), ".") && ftok->astParent()->astOperand1()) { - const Token* contTok = ftok->astParent()->astOperand1(); - if (contTok->valueType() && contTok->valueType()->container) - return contTok->valueType()->container->getReturnType(ftok->str()); - } - if (isNotLibraryFunction(ftok)) + if (isNotLibraryFunction(ftok)) { + if (Token::simpleMatch(ftok->astParent(), ".") && ftok->astParent()->astOperand1()) { + const Token* contTok = ftok->astParent()->astOperand1(); + if (contTok->valueType() && contTok->valueType()->container) + return contTok->valueType()->container->getReturnType(ftok->str()); + } return emptyString; + } const std::map::const_iterator it = mReturnValueType.find(getFunctionName(ftok)); return it != mReturnValueType.cend() ? it->second : emptyString; } @@ -1492,14 +1494,15 @@ bool Library::isFunctionConst(const Token *ftok) const { if (ftok->function() && ftok->function()->isConst()) return true; - if (Token::simpleMatch(ftok->astParent(), ".")) { - using Yield = Library::Container::Yield; - const Yield yield = astContainerYield(ftok->astParent()->astOperand1()); - if (yield == Yield::EMPTY || yield == Yield::SIZE || yield == Yield::BUFFER_NT) - return true; - } - if (isNotLibraryFunction(ftok)) + if (isNotLibraryFunction(ftok)) { + if (Token::simpleMatch(ftok->astParent(), ".")) { + using Yield = Library::Container::Yield; + const Yield yield = astContainerYield(ftok->astParent()->astOperand1()); + if (yield == Yield::EMPTY || yield == Yield::SIZE || yield == Yield::BUFFER_NT) + return true; + } return false; + } const std::unordered_map::const_iterator it = functions.find(getFunctionName(ftok)); return (it != functions.cend() && it->second.isconst); } @@ -1508,13 +1511,14 @@ bool Library::isnoreturn(const Token *ftok) const { if (ftok->function() && ftok->function()->isAttributeNoreturn()) return true; - if (Token::simpleMatch(ftok->astParent(), ".")) { - if (astContainerAction(ftok->astParent()->astOperand1()) != Library::Container::Action::NO_ACTION || - astContainerYield(ftok->astParent()->astOperand1()) != Library::Container::Yield::NO_YIELD) - return false; - } - if (isNotLibraryFunction(ftok)) + if (isNotLibraryFunction(ftok)) { + if (Token::simpleMatch(ftok->astParent(), ".")) { + if (astContainerAction(ftok->astParent()->astOperand1()) != Library::Container::Action::NO_ACTION || + astContainerYield(ftok->astParent()->astOperand1()) != Library::Container::Yield::NO_YIELD) + return false; + } return false; + } const std::unordered_map::const_iterator it = mNoReturn.find(getFunctionName(ftok)); if (it == mNoReturn.end()) return false; From 55a279fade13d2acd7b878c5510d8b84b06fade9 Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 7 Jun 2023 18:09:35 +0200 Subject: [PATCH 10/16] Fix compilation --- test/testsymboldatabase.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 6c664e169..0cf7de47a 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -8166,12 +8166,11 @@ private: vector.startPattern2 = "Vector !!::"; vector.type_templateArgNo = 0; vector.arrayLike_indexOp = true; - vector.functions["front"] = - Library::Container::Function{Library::Container::Action::NO_ACTION, Library::Container::Yield::ITEM}; - vector.functions["data"] = - Library::Container::Function{Library::Container::Action::NO_ACTION, Library::Container::Yield::BUFFER}; - vector.functions["begin"] = Library::Container::Function{Library::Container::Action::NO_ACTION, - Library::Container::Yield::START_ITERATOR}; + using Action = Library::Container::Action; + using Yield = Library::Container::Yield; + vector.functions["front"] = Library::Container::Function{ Action::NO_ACTION, Yield::ITEM, "" }; + vector.functions["data"] = Library::Container::Function{ Action::NO_ACTION, Yield::BUFFER, "" }; + vector.functions["begin"] = Library::Container::Function{ Action::NO_ACTION, Yield::START_ITERATOR, "" }; set.library.containers["Vector"] = vector; Library::Container string; string.startPattern = "test :: string"; From f17f03befaa0446a1802885aaac9707e99f9e1cb Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 7 Jun 2023 18:38:22 +0200 Subject: [PATCH 11/16] C++11 sucks --- lib/library.h | 4 ++-- test/testsymboldatabase.cpp | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/library.h b/lib/library.h index cbc2e0469..2e38a7332 100644 --- a/lib/library.h +++ b/lib/library.h @@ -249,8 +249,8 @@ public: NO_YIELD }; struct Function { - Action action = Action::NO_ACTION; - Yield yield = Yield::NO_YIELD; + Action action; + Yield yield; std::string returnType; }; struct RangeItemRecordTypeItem { diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 0cf7de47a..6c664e169 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -8166,11 +8166,12 @@ private: vector.startPattern2 = "Vector !!::"; vector.type_templateArgNo = 0; vector.arrayLike_indexOp = true; - using Action = Library::Container::Action; - using Yield = Library::Container::Yield; - vector.functions["front"] = Library::Container::Function{ Action::NO_ACTION, Yield::ITEM, "" }; - vector.functions["data"] = Library::Container::Function{ Action::NO_ACTION, Yield::BUFFER, "" }; - vector.functions["begin"] = Library::Container::Function{ Action::NO_ACTION, Yield::START_ITERATOR, "" }; + vector.functions["front"] = + Library::Container::Function{Library::Container::Action::NO_ACTION, Library::Container::Yield::ITEM}; + vector.functions["data"] = + Library::Container::Function{Library::Container::Action::NO_ACTION, Library::Container::Yield::BUFFER}; + vector.functions["begin"] = Library::Container::Function{Library::Container::Action::NO_ACTION, + Library::Container::Yield::START_ITERATOR}; set.library.containers["Vector"] = vector; Library::Container string; string.startPattern = "test :: string"; From 006a323caacf7ec772bc3361e3ac40b9e1c5f56a Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 7 Jun 2023 20:05:34 +0200 Subject: [PATCH 12/16] Format --- lib/library.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/library.cpp b/lib/library.cpp index 14d1d2bdd..34b84076f 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -1375,7 +1375,7 @@ Library::UseRetValType Library::getUseRetValType(const Token *ftok) const (yield == Yield::ITEM && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION) || (yield == Yield::ITERATOR && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION)) return Library::UseRetValType::DEFAULT; - } + } return Library::UseRetValType::NONE; } const std::unordered_map::const_iterator it = functions.find(getFunctionName(ftok)); @@ -1396,9 +1396,9 @@ const std::string& Library::returnValueType(const Token *ftok) const { if (isNotLibraryFunction(ftok)) { if (Token::simpleMatch(ftok->astParent(), ".") && ftok->astParent()->astOperand1()) { - const Token* contTok = ftok->astParent()->astOperand1(); - if (contTok->valueType() && contTok->valueType()->container) - return contTok->valueType()->container->getReturnType(ftok->str()); + const Token* contTok = ftok->astParent()->astOperand1(); + if (contTok->valueType() && contTok->valueType()->container) + return contTok->valueType()->container->getReturnType(ftok->str()); } return emptyString; } @@ -1516,7 +1516,7 @@ bool Library::isnoreturn(const Token *ftok) const if (astContainerAction(ftok->astParent()->astOperand1()) != Library::Container::Action::NO_ACTION || astContainerYield(ftok->astParent()->astOperand1()) != Library::Container::Yield::NO_YIELD) return false; - } + } return false; } const std::unordered_map::const_iterator it = mNoReturn.find(getFunctionName(ftok)); From e5616c7c0075f87d1c8bf7bad8cd9ba99658733a Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 7 Jun 2023 20:12:30 +0200 Subject: [PATCH 13/16] Undo --- cfg/std.cfg | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cfg/std.cfg b/cfg/std.cfg index 59673e1d4..14df91070 100644 --- a/cfg/std.cfg +++ b/cfg/std.cfg @@ -6667,6 +6667,12 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun + + + + + false + From 127a66d291663f28aea760ff9135fda9cf492d8a Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Wed, 7 Jun 2023 21:19:50 +0200 Subject: [PATCH 14/16] Move to size category --- cfg/std.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cfg/std.cfg b/cfg/std.cfg index 14df91070..b40a500be 100644 --- a/cfg/std.cfg +++ b/cfg/std.cfg @@ -8735,6 +8735,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init + @@ -8742,7 +8743,6 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init - From 2da453fdc96a30f3ef725e043a63d4f28b41a897 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 8 Jun 2023 00:38:54 +0200 Subject: [PATCH 15/16] Update library.cpp --- lib/library.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/library.cpp b/lib/library.cpp index 34b84076f..f54c9ffdd 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -1372,8 +1372,7 @@ Library::UseRetValType Library::getUseRetValType(const Token *ftok) const const Yield yield = astContainerYield(ftok->astParent()->astOperand1()); if (yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR || yield == Yield::AT_INDEX || yield == Yield::SIZE || yield == Yield::EMPTY || yield == Yield::BUFFER || yield == Yield::BUFFER_NT || - (yield == Yield::ITEM && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION) || - (yield == Yield::ITERATOR && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION)) + ((yield == Yield::ITEM || yield == Yield::ITERATOR) && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION)) return Library::UseRetValType::DEFAULT; } return Library::UseRetValType::NONE; From f5c61bebefec88bf3a08a602155b3806a7114e71 Mon Sep 17 00:00:00 2001 From: chrchr Date: Fri, 9 Jun 2023 18:21:26 +0200 Subject: [PATCH 16/16] Simplify --- lib/library.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/library.cpp b/lib/library.cpp index f54c9ffdd..c80c94f88 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -1368,11 +1368,12 @@ Library::UseRetValType Library::getUseRetValType(const Token *ftok) const { if (isNotLibraryFunction(ftok)) { if (Token::simpleMatch(ftok->astParent(), ".")) { + const Token* contTok = ftok->astParent()->astOperand1(); using Yield = Library::Container::Yield; - const Yield yield = astContainerYield(ftok->astParent()->astOperand1()); + const Yield yield = astContainerYield(contTok); if (yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR || yield == Yield::AT_INDEX || yield == Yield::SIZE || yield == Yield::EMPTY || yield == Yield::BUFFER || yield == Yield::BUFFER_NT || - ((yield == Yield::ITEM || yield == Yield::ITERATOR) && astContainerAction(ftok->astParent()->astOperand1()) == Library::Container::Action::NO_ACTION)) + ((yield == Yield::ITEM || yield == Yield::ITERATOR) && astContainerAction(contTok) == Library::Container::Action::NO_ACTION)) return Library::UseRetValType::DEFAULT; } return Library::UseRetValType::NONE; @@ -1512,8 +1513,9 @@ bool Library::isnoreturn(const Token *ftok) const return true; if (isNotLibraryFunction(ftok)) { if (Token::simpleMatch(ftok->astParent(), ".")) { - if (astContainerAction(ftok->astParent()->astOperand1()) != Library::Container::Action::NO_ACTION || - astContainerYield(ftok->astParent()->astOperand1()) != Library::Container::Yield::NO_YIELD) + const Token* contTok = ftok->astParent()->astOperand1(); + if (astContainerAction(contTok) != Library::Container::Action::NO_ACTION || + astContainerYield(contTok) != Library::Container::Yield::NO_YIELD) return false; } return false;