From 985efe3a8b3be7d114ea92b121ef3c84c61c3f83 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 30 Oct 2026 11:21:57 +0100 Subject: [PATCH 1/9] Update checkstl.h --- lib/checkstl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkstl.h b/lib/checkstl.h index 0f9a70a7a15..799b4b13f76 100644 --- a/lib/checkstl.h +++ b/lib/checkstl.h @@ -214,7 +214,7 @@ class CPPCHECKLIB CheckStlImpl : public CheckImpl { void iteratorsError(const Token* tok, const std::string& containerName1, const std::string& containerName2); void iteratorsError(const Token* tok, const Token* containerTok, const std::string& containerName); void mismatchingContainerIteratorError(const Token* containerTok, const Token* iterTok, const Token* containerTok2); - void mismatchingContainersError(const Token* tok1, const Token* tok2); + void mismatchingContainersError(const Token* tok1, const Token* tok2, ValueFlow::Value::LifetimeKind ltk = ValueFlow::Value::LifetimeKind::Iterator); void mismatchingContainerExpressionError(const Token *tok1, const Token *tok2); void sameIteratorExpressionError(const Token *tok); void stlBoundariesError(const Token* tok); From c3913d82efa26cd33619e658e233f05776efaf36 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 30 Oct 2026 11:23:12 +0100 Subject: [PATCH 2/9] Update checkstl.cpp --- lib/checkstl.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index a4e8a92c188..c5a37329b3e 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -652,14 +652,16 @@ void CheckStlImpl::mismatchingContainerIteratorError(const Token* containerTok, } // Error message for bad iterator usage.. -void CheckStlImpl::mismatchingContainersError(const Token* tok1, const Token* tok2) +void CheckStlImpl::mismatchingContainersError(const Token* tok1, const Token* tok2, ValueFlow::Value::LifetimeKind ltk) { const std::string expr1(tok1 ? tok1->expressionString() : std::string("v1")); const std::string expr2(tok2 ? tok2->expressionString() : std::string("v2")); + const std::string dataStr = (ltk == ValueFlow::Value::LifetimeKind::Iterator) ? "Iterators" : (ltk == ValueFlow::Value::LifetimeKind::Address ? "Addresses" : "Pointers" ); + const std::string objectStr = (ltk == ValueFlow::Value::LifetimeKind::Iterator || ltk == ValueFlow::Value::LifetimeKind::Object) ? "containers '" : "objects '"; reportError(tok1, Severity::error, "mismatchingContainers", - "Iterators of different containers '" + expr1 + "' and '" + expr2 + "' are used together.", + dataStr + " of different " + objectStr + expr1 + "' and '" + expr2 + "' are used together.", CWE664, Certainty::normal); } From bfef6f5e3f1f311e1d5307ecec608c6c0a6d561f Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 30 Oct 2026 11:24:57 +0100 Subject: [PATCH 3/9] Update teststl.cpp --- test/teststl.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/test/teststl.cpp b/test/teststl.cpp index bb20d2d8182..bc8d7bb2a43 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -75,6 +75,7 @@ class TestStl : public TestFixture { TEST_CASE(iterator29); TEST_CASE(iterator30); TEST_CASE(iterator31); + TEST_CASE(iterator32); TEST_CASE(iteratorExpression); TEST_CASE(iteratorSameExpression); TEST_CASE(mismatchingContainerIterator); @@ -1914,13 +1915,13 @@ class TestStl : public TestFixture { check("void f(int a, int b) {\n" " if (std::for_each(&a, &b + 1, [](auto) {})) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2:22]: (error) Iterators of different containers 'a' and 'b' are used together. [mismatchingContainers]\n", + ASSERT_EQUALS("[test.cpp:2:22]: (error) Addresses of different objects 'a' and 'b' are used together. [mismatchingContainers]\n", errout_str()); check("void f(int a, int b) {\n" " if (std::for_each(&a, &b, [](auto) {})) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2:22]: (error) Iterators of different containers 'a' and 'b' are used together. [mismatchingContainers]\n", + ASSERT_EQUALS("[test.cpp:2:22]: (error) Addresses of different objects 'a' and 'b' are used together. [mismatchingContainers]\n", errout_str()); check("void f(int a) {\n" @@ -2061,8 +2062,21 @@ class TestStl : public TestFixture { " std::string b;\n" " return t.s.a.c_str() == b.c_str();\n" "}\n"); - ASSERT_EQUALS("[test.cpp:9:13]: (error) Iterators of different containers 's.a' and 'b' are used together. [mismatchingContainers]\n" - "[test.cpp:13:15]: (error) Iterators of different containers 't.s.a' and 'b' are used together. [mismatchingContainers]\n", + ASSERT_EQUALS("[test.cpp:9:13]: (error) Pointers of different containers 's.a' and 'b' are used together. [mismatchingContainers]\n" + "[test.cpp:13:15]: (error) Pointers of different containers 't.s.a' and 'b' are used together. [mismatchingContainers]\n", + errout_str()); + } + + void iterator32() + { + check("bool f(const std::string& a, const std::string& b) {\n" // #15158 + " return a.data() != b.data();\n" + "}\n" + "bool g(const std::unique_ptr& a, const std::unique_ptr& b) {\n" + " return a.get() != b.get();\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:2:12]: (error) Pointers of different containers 'a' and 'b' are used together. [mismatchingContainers]\n" + "[test.cpp:5:12]: (error) Pointers of different objects 'a' and 'b' are used together. [mismatchingContainers]\n", errout_str()); } From d99aa0a62b623543247951cfcdfe24b9c4f7edf5 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 30 Oct 2026 11:37:38 +0100 Subject: [PATCH 4/9] Update checkstl.h --- lib/checkstl.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/checkstl.h b/lib/checkstl.h index 799b4b13f76..373504b0e28 100644 --- a/lib/checkstl.h +++ b/lib/checkstl.h @@ -27,6 +27,7 @@ #include "config.h" #include "errortypes.h" #include "mathlib.h" +#include "valueflow.h" #include #include @@ -37,10 +38,6 @@ class Token; class Variable; class ErrorLogger; class Tokenizer; -namespace ValueFlow -{ - class Value; -} /// @addtogroup Checks /// @{ From f7d654101f384aac71b8c741082f12e7e053535b Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 30 Oct 2026 11:49:48 +0100 Subject: [PATCH 5/9] Update checkstl.cpp [skip ci] --- lib/checkstl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index c5a37329b3e..95db3fe101d 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -657,7 +657,7 @@ void CheckStlImpl::mismatchingContainersError(const Token* tok1, const Token* to const std::string expr1(tok1 ? tok1->expressionString() : std::string("v1")); const std::string expr2(tok2 ? tok2->expressionString() : std::string("v2")); const std::string dataStr = (ltk == ValueFlow::Value::LifetimeKind::Iterator) ? "Iterators" : (ltk == ValueFlow::Value::LifetimeKind::Address ? "Addresses" : "Pointers" ); - const std::string objectStr = (ltk == ValueFlow::Value::LifetimeKind::Iterator || ltk == ValueFlow::Value::LifetimeKind::Object) ? "containers '" : "objects '"; + const std::string objectStr = (ltk == ValueFlow::Value::LifetimeKind::Iterator || ltk == ValueFlow::Value::LifetimeKind::Object) ? "containers '" : "objects '"; reportError(tok1, Severity::error, "mismatchingContainers", From 2480f729ac14d1ab26bb87caa7e7d36570f1a404 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 30 Oct 2026 12:05:06 +0100 Subject: [PATCH 6/9] Update checkstl.h --- lib/checkstl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkstl.h b/lib/checkstl.h index 373504b0e28..0c2ebae9793 100644 --- a/lib/checkstl.h +++ b/lib/checkstl.h @@ -27,7 +27,7 @@ #include "config.h" #include "errortypes.h" #include "mathlib.h" -#include "valueflow.h" +#include "vfvalue.h" #include #include From a923f5273eec37f670beddd338d5369fc47dea73 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 30 Oct 2026 12:28:39 +0100 Subject: [PATCH 7/9] Update checkstl.cpp --- lib/checkstl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 95db3fe101d..e88481c51c1 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -656,7 +656,7 @@ void CheckStlImpl::mismatchingContainersError(const Token* tok1, const Token* to { const std::string expr1(tok1 ? tok1->expressionString() : std::string("v1")); const std::string expr2(tok2 ? tok2->expressionString() : std::string("v2")); - const std::string dataStr = (ltk == ValueFlow::Value::LifetimeKind::Iterator) ? "Iterators" : (ltk == ValueFlow::Value::LifetimeKind::Address ? "Addresses" : "Pointers" ); + const std::string dataStr = (ltk == ValueFlow::Value::LifetimeKind::Iterator) ? "Iterators" : (ltk == ValueFlow::Value::LifetimeKind::Address ? "Addresses" : "Pointers"); const std::string objectStr = (ltk == ValueFlow::Value::LifetimeKind::Iterator || ltk == ValueFlow::Value::LifetimeKind::Object) ? "containers '" : "objects '"; reportError(tok1, Severity::error, @@ -793,7 +793,7 @@ bool CheckStlImpl::checkIteratorPair(const Token* tok1, const Token* tok2) if (val1.tokvalue->expressionString() == val2.tokvalue->expressionString()) iteratorsError(tok1, val1.tokvalue, val1.tokvalue->expressionString()); else - mismatchingContainersError(val1.tokvalue, val2.tokvalue); + mismatchingContainersError(val1.tokvalue, val2.tokvalue, val1.lifetimeKind); return true; } From 6cea409ce0555317da4f4232b12663b35458e803 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 30 Oct 2026 12:58:34 +0100 Subject: [PATCH 8/9] Update Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index daed0997479..4d16029f5db 100644 --- a/Makefile +++ b/Makefile @@ -901,7 +901,7 @@ test/testsimplifyusing.o: test/testsimplifyusing.cpp lib/check.h lib/checkers.h test/testsingleexecutor.o: test/testsingleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/refthunk.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsingleexecutor.cpp -test/testsizeof.o: test/testsizeof.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checksizeof.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/refthunk.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/teststl.o: test/teststl.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/refthunk.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsizeof.cpp test/teststandards.o: test/teststandards.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/refthunk.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h From 4c3e461ca68f9d0e5dfdd7a4c13dc48de0dd6a4d Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 30 Oct 2026 13:27:55 +0100 Subject: [PATCH 9/9] Update Makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 4d16029f5db..baa32b81669 100644 --- a/Makefile +++ b/Makefile @@ -901,13 +901,13 @@ test/testsimplifyusing.o: test/testsimplifyusing.cpp lib/check.h lib/checkers.h test/testsingleexecutor.o: test/testsingleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/refthunk.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsingleexecutor.cpp -test/teststl.o: test/teststl.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/refthunk.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsizeof.o: test/testsizeof.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checksizeof.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/refthunk.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsizeof.cpp test/teststandards.o: test/teststandards.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/refthunk.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststandards.cpp -test/teststl.o: test/teststl.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/refthunk.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/teststl.o: test/teststl.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/refthunk.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststl.cpp test/teststring.o: test/teststring.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/refthunk.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h