diff --git a/.clang-tidy b/.clang-tidy
index e1032aaa5f3..8c30f2c602b 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -18,18 +18,19 @@ Checks: >
-objc-*,
-openmp-*,
-zircon-*,
- cert-err34-c,
cppcoreguidelines-pro-type-static-cast-downcast,
cppcoreguidelines-rvalue-reference-param-not-moved,
google-explicit-constructor,
-bugprone-assignment-in-if-condition,
-bugprone-branch-clone,
+ -bugprone-command-processor,
-bugprone-easily-swappable-parameters,
-bugprone-empty-catch,
-bugprone-macro-parentheses,
-bugprone-narrowing-conversions,
-bugprone-signed-char-misuse,
-bugprone-switch-missing-default-case,
+ -bugprone-throwing-static-initialization,
-bugprone-unchecked-optional-access,
-clang-analyzer-*,
-concurrency-mt-unsafe,
@@ -69,9 +70,11 @@ Checks: >
-readability-implicit-bool-conversion,
-readability-isolate-declaration,
-readability-magic-numbers,
+ -readability-redundant-parentheses,
-readability-suspicious-call-argument,
-readability-uppercase-literal-suffix,
- -readability-use-concise-preprocessor-directives
+ -readability-use-concise-preprocessor-directives,
+ -misc-unconventional-assign-operator
WarningsAsErrors: '*'
HeaderFilterRegex: '(cli|gui|frontend|lib|oss-fuzz|test|triage)\/[a-z_]+\.h'
ExcludeHeaderFilterRegex: 'ui_.*.h'
@@ -82,3 +85,5 @@ CheckOptions:
value: '0'
- key: modernize-use-trailing-return-type.TransformFunctions
value: false
+ - key: misc-override-with-different-visibility.DisallowedVisibilityChange
+ value: widening
diff --git a/.github/workflows/asan.yml b/.github/workflows/asan.yml
index 70b3a30f0ae..642dbfd151c 100644
--- a/.github/workflows/asan.yml
+++ b/.github/workflows/asan.yml
@@ -54,7 +54,7 @@ jobs:
sudo apt-get purge --auto-remove llvm python3-lldb-14 llvm-14
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
- sudo ./llvm.sh 21
+ sudo ./llvm.sh 22
- name: Install Qt ${{ env.QT_VERSION }}
uses: jurplel/install-qt-action@v4
@@ -76,8 +76,8 @@ jobs:
run: |
cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_MATCHCOMPILER=Verify -DANALYZE_ADDRESS=On -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DFILESDIR= -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
env:
- CC: clang-21
- CXX: clang++-21
+ CC: clang-22
+ CXX: clang++-22
- name: Build cppcheck
run: |
diff --git a/.github/workflows/clang-tidy.yml b/.github/workflows/clang-tidy.yml
index 7b2c4f4e2c7..5d7445f34b5 100644
--- a/.github/workflows/clang-tidy.yml
+++ b/.github/workflows/clang-tidy.yml
@@ -43,8 +43,8 @@ jobs:
sudo apt-get purge --auto-remove llvm python3-lldb-14 llvm-14
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
- sudo ./llvm.sh 21
- sudo apt-get install -y clang-tidy-21
+ sudo ./llvm.sh 22
+ sudo apt-get install -y clang-tidy-22
- name: Install Qt ${{ env.QT_VERSION }}
uses: jurplel/install-qt-action@v4
@@ -57,14 +57,14 @@ jobs:
- name: Verify clang-tidy configuration
run: |
- clang-tidy-21 --verify-config
+ clang-tidy-22 --verify-config
- name: Prepare CMake
run: |
cmake -S . -B cmake.output -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCPPCHK_GLIBCXX_DEBUG=Off -DWARNINGS_ARE_ERRORS=On
env:
- CC: clang-21
- CXX: clang++-21
+ CC: clang-22
+ CXX: clang++-22
- name: Prepare CMake dependencies
run: |
diff --git a/.github/workflows/iwyu.yml b/.github/workflows/iwyu.yml
index 649991f9373..772a0da320c 100644
--- a/.github/workflows/iwyu.yml
+++ b/.github/workflows/iwyu.yml
@@ -214,13 +214,13 @@ jobs:
sudo apt-get purge --auto-remove llvm python3-lldb-14 llvm-14
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
- sudo ./llvm.sh 21
- sudo apt-get install -y clang-tools-21
+ sudo ./llvm.sh 22
+ sudo apt-get install -y clang-tools-22
- name: Install libc++
if: matrix.stdlib == 'libc++'
run: |
- sudo apt-get install -y libc++-21-dev
+ sudo apt-get install -y libc++-22-dev
- name: Install Qt ${{ env.QT_VERSION }}
uses: jurplel/install-qt-action@v4
@@ -235,8 +235,8 @@ jobs:
run: |
cmake -S . -B cmake.output -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCPPCHK_GLIBCXX_DEBUG=Off -DUSE_MATCHCOMPILER=Off -DEXTERNALS_AS_SYSTEM=On -DUSE_LIBCXX=${{ matrix.use_libcxx }}
env:
- CC: clang-21
- CXX: clang++-21
+ CC: clang-22
+ CXX: clang++-22
- name: Prepare CMake dependencies
run: |
@@ -253,7 +253,7 @@ jobs:
- name: clang-include-cleaner
run: |
# TODO: run multi-threaded
- find $PWD/cli $PWD/lib $PWD/test $PWD/gui -maxdepth 1 -name "*.cpp" | xargs -t -n 1 clang-include-cleaner-21 --print=changes --extra-arg=-w --extra-arg=-stdlib=${{ matrix.stdlib }} -p cmake.output > clang-include-cleaner.log 2>&1
+ find $PWD/cli $PWD/lib $PWD/test $PWD/gui -maxdepth 1 -name "*.cpp" | xargs -t -n 1 clang-include-cleaner-22 --print=changes --extra-arg=-w --extra-arg=-stdlib=${{ matrix.stdlib }} -p cmake.output > clang-include-cleaner.log 2>&1
- uses: actions/upload-artifact@v4
if: success() || failure()
diff --git a/.github/workflows/tsan.yml b/.github/workflows/tsan.yml
index 27ed6606386..cd1fad16751 100644
--- a/.github/workflows/tsan.yml
+++ b/.github/workflows/tsan.yml
@@ -53,7 +53,7 @@ jobs:
sudo apt-get purge --auto-remove llvm python3-lldb-14 llvm-14
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
- sudo ./llvm.sh 21
+ sudo ./llvm.sh 22
- name: Install Qt ${{ env.QT_VERSION }}
uses: jurplel/install-qt-action@v4
@@ -75,8 +75,8 @@ jobs:
run: |
cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_MATCHCOMPILER=Verify -DANALYZE_THREAD=On -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=Off -DDISABLE_DMAKE=On -DFILESDIR= -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
env:
- CC: clang-21
- CXX: clang++-21
+ CC: clang-22
+ CXX: clang++-22
- name: Build cppcheck
run: |
diff --git a/.github/workflows/ubsan.yml b/.github/workflows/ubsan.yml
index 64eb02a4b25..ecfe0f05379 100644
--- a/.github/workflows/ubsan.yml
+++ b/.github/workflows/ubsan.yml
@@ -53,7 +53,7 @@ jobs:
sudo apt-get purge --auto-remove llvm python3-lldb-14 llvm-14
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
- sudo ./llvm.sh 21
+ sudo ./llvm.sh 22
- name: Install Qt ${{ env.QT_VERSION }}
uses: jurplel/install-qt-action@v4
@@ -75,8 +75,8 @@ jobs:
run: |
cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_MATCHCOMPILER=Verify -DANALYZE_UNDEFINED=On -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DFILESDIR= -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
env:
- CC: clang-21
- CXX: clang++-21
+ CC: clang-22
+ CXX: clang++-22
- name: Build cppcheck
run: |
diff --git a/clang-tidy.md b/clang-tidy.md
index 72df0375ca1..aae6918e372 100644
--- a/clang-tidy.md
+++ b/clang-tidy.md
@@ -130,6 +130,9 @@ Does not improve the readability.
`modernize-use-designated-initializers`
`readability-enum-initial-value`
`modernize-use-trailing-return-type`
+`misc-unconventional-assign-operator`
+`bugprone-throwing-static-initialization`
+`bugprone-command-processor`
To be evaluated (need to remove exclusion).
@@ -156,6 +159,10 @@ These apply to codebases which use later standards then C++11 (C++17 is used whe
We are not interested in this.
+`readability-redundant-parentheses`
+
+Reports false positives - see https://github.com/llvm/llvm-project/issues/164125.
+
### Disabled for performance reasons
`portability-std-allocator-const`
diff --git a/cli/signalhandler.cpp b/cli/signalhandler.cpp
index 4f84f036c7e..d09bbd349d0 100644
--- a/cli/signalhandler.cpp
+++ b/cli/signalhandler.cpp
@@ -238,7 +238,7 @@ static void CppcheckSignalHandler(int signo, siginfo_t * info, void * context)
}
fprintf(output, " (at 0x%lx).%s\n",
reinterpret_cast(info->si_addr),
- (isAddressOnStack)?" Stackoverflow?":"");
+ isAddressOnStack ? " Stackoverflow?" : "");
break;
case SIGINT:
unexpectedSignal=false; // legal usage: interrupt application via CTRL-C
@@ -264,7 +264,7 @@ static void CppcheckSignalHandler(int signo, siginfo_t * info, void * context)
(type==-1)? "" :
(type==0) ? "reading " : "writing ",
reinterpret_cast(info->si_addr),
- (isAddressOnStack)?" Stackoverflow?":""
+ isAddressOnStack ? " Stackoverflow?" : ""
);
break;
case SIGUSR1:
diff --git a/cmake/clang_tidy.cmake b/cmake/clang_tidy.cmake
index e9a9148c6fe..fe0efbbe32f 100644
--- a/cmake/clang_tidy.cmake
+++ b/cmake/clang_tidy.cmake
@@ -11,7 +11,7 @@ if(NOT CMAKE_DISABLE_PRECOMPILE_HEADERS)
message(STATUS "Cannot use non-Clang compiler with clang-tidy when precompiled headers are enabled - skipping 'run-clang-tidy'/'run-clang-tidy-csa' target generation")
endif()
else()
- set(RUN_CLANG_TIDY_NAMES run-clang-tidy run-clang-tidy-21 run-clang-tidy-20 run-clang-tidy-19 run-clang-tidy-18 run-clang-tidy-17 run-clang-tidy-16 run-clang-tidy-15 run-clang-tidy-14 run-clang-tidy-13 run-clang-tidy-12 run-clang-tidy-11 run-clang-tidy-10 run-clang-tidy-9 run-clang-tidy-8)
+ set(RUN_CLANG_TIDY_NAMES run-clang-tidy run-clang-tidy-22 run-clang-tidy-21 run-clang-tidy-20 run-clang-tidy-19 run-clang-tidy-18 run-clang-tidy-17 run-clang-tidy-16 run-clang-tidy-15 run-clang-tidy-14 run-clang-tidy-13 run-clang-tidy-12 run-clang-tidy-11 run-clang-tidy-10 run-clang-tidy-9 run-clang-tidy-8)
endif()
if(RUN_CLANG_TIDY_NAMES)
@@ -25,6 +25,9 @@ if(RUN_CLANG_TIDY_NAMES)
endif()
message(STATUS "NPROC=${NPROC}")
+ # TODO: introduced in run-clang-tidy-22
+ set(CLANG_TIDY_CONFIG "-enable-check-profile")
+
# most of these are disabled because they are too noisy in our code
# clang-analyzer-core.CallAndMessage
# clang-analyzer-core.NonNullParamChecker
@@ -41,13 +44,12 @@ if(RUN_CLANG_TIDY_NAMES)
# TODO: exclude moc_*.cpp
# TODO: exclude mocs_compilation.cpp
- # disable all compiler warnings since we are just interested in the tidy ones
add_custom_target(run-clang-tidy
- ${Python_EXECUTABLE} ${RUN_CLANG_TIDY} -p=${CMAKE_BINARY_DIR} -j ${NPROC} -quiet
+ ${Python_EXECUTABLE} ${RUN_CLANG_TIDY} -p=${CMAKE_BINARY_DIR} -j ${NPROC} -quiet ${CLANG_TIDY_CONFIG}
USES_TERMINAL
VERBATIM)
add_custom_target(run-clang-tidy-csa
- ${Python_EXECUTABLE} ${RUN_CLANG_TIDY} -p=${CMAKE_BINARY_DIR} -j ${NPROC} -quiet ${CLANG_TIDY_CSA_ALPHA_OPTS} ${CLANG_TIDY_CSA_CONFIG}
+ ${Python_EXECUTABLE} ${RUN_CLANG_TIDY} -p=${CMAKE_BINARY_DIR} -j ${NPROC} -quiet ${CLANG_TIDY_CONFIG} ${CLANG_TIDY_CSA_ALPHA_OPTS} ${CLANG_TIDY_CSA_CONFIG}
USES_TERMINAL
VERBATIM)
if(BUILD_GUI)
diff --git a/gui/checkthread.h b/gui/checkthread.h
index 892bdf5258d..4247a45094c 100644
--- a/gui/checkthread.h
+++ b/gui/checkthread.h
@@ -78,12 +78,6 @@ class CheckThread : public QThread {
mSuppressionsUi = s;
}
- /**
- * @brief method that is run in a thread
- *
- */
- void run() override;
-
void stop();
/**
@@ -137,6 +131,12 @@ class CheckThread : public QThread {
std::shared_ptr mSuppressions;
private:
+ /**
+ * @brief method that is run in a thread
+ *
+ */
+ void run() override;
+
void runAddonsAndTools(const Settings& settings, const FileSettings *fileSettings, const QString &fileName);
void parseClangErrors(const QString &tool, const QString &file0, QString err);
diff --git a/gui/codeeditor.h b/gui/codeeditor.h
index 9508c562c41..1ba8b3fd84d 100644
--- a/gui/codeeditor.h
+++ b/gui/codeeditor.h
@@ -119,6 +119,7 @@ class CodeEditor : public QPlainTextEdit {
return mFileName;
}
+ // NOLINTNEXTLINE(bugprone-derived-method-shadowing-base-method) - TODO: fix this
void clear() {
mFileName.clear();
setPlainText(QString());
diff --git a/gui/resultstree.h b/gui/resultstree.h
index efa759cd6d1..a2b07788f56 100644
--- a/gui/resultstree.h
+++ b/gui/resultstree.h
@@ -202,8 +202,6 @@ class ResultsTree : public QTreeView {
*/
ShowTypes mShowSeverities;
- void keyPressEvent(QKeyEvent *event) override;
-
void setReportType(ReportType reportType);
/**
@@ -557,6 +555,8 @@ protected slots:
bool mVisibleErrors{};
private:
+ void keyPressEvent(QKeyEvent *event) override;
+
/** tag selected items */
void tagSelectedItems(const QString &tag);
diff --git a/gui/translationhandler.h b/gui/translationhandler.h
index 0b2988f583e..8ab5b46b6f7 100644
--- a/gui/translationhandler.h
+++ b/gui/translationhandler.h
@@ -59,7 +59,7 @@ struct TranslationInfo {
* track which translation is the currently active translation.
*
*/
-class TranslationHandler : QObject {
+class TranslationHandler : public QObject {
Q_OBJECT
public:
explicit TranslationHandler(QObject *parent = nullptr);
diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp
index ab0ad0505b0..bc18c3dc477 100644
--- a/lib/checkautovariables.cpp
+++ b/lib/checkautovariables.cpp
@@ -308,7 +308,7 @@ void CheckAutoVariables::autoVariables()
for (const ValueFlow::Value &v : tok->values()) {
if (v.isImpossible())
continue;
- if ((v.isTokValue() && (isArrayVar(v.tokvalue) || ((v.tokvalue->tokType() == Token::eString)))) ||
+ if ((v.isTokValue() && (isArrayVar(v.tokvalue) || (v.tokvalue->tokType() == Token::eString))) ||
(v.isLocalLifetimeValue() && v.lifetimeKind == ValueFlow::Value::LifetimeKind::Address && !Token::simpleMatch(v.tokvalue, "("))) {
errorInvalidDeallocation(tok, &v);
break;
diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp
index 57c46492bc0..b052fd52b51 100644
--- a/lib/checkbufferoverrun.cpp
+++ b/lib/checkbufferoverrun.cpp
@@ -156,14 +156,14 @@ static int getMinFormatStringOutputLength(const std::vector ¶m
outputStringSize++;
if (handleNextParameter) {
- // NOLINTNEXTLINE(cert-err34-c) - intentional use
+ // NOLINTNEXTLINE(bugprone-unchecked-string-to-number-conversion) - intentional use
int tempDigits = std::abs(std::atoi(digits_string.c_str()));
if (i_d_x_f_found)
tempDigits = std::max(tempDigits, 1);
if (digits_string.find('.') != std::string::npos) {
const std::string endStr = digits_string.substr(digits_string.find('.') + 1);
- // NOLINTNEXTLINE(cert-err34-c) - intentional use
+ // NOLINTNEXTLINE(bugprone-unchecked-string-to-number-conversion) - intentional use
const int maxLen = std::max(std::abs(std::atoi(endStr.c_str())), 1);
if (formatString[i] == 's') {
diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp
index d8f7d16fbaf..1248bb5fa13 100644
--- a/lib/checkclass.cpp
+++ b/lib/checkclass.cpp
@@ -3188,9 +3188,9 @@ enum class CtorType : std::uint8_t {
void CheckClass::checkCopyCtorAndEqOperator()
{
- // This is disabled because of #8388
+ // TODO: This is disabled because of #8388
// The message must be clarified. How is the behaviour different?
- if ((true) || !mSettings->severity.isEnabled(Severity::warning)) // NOLINT(readability-simplify-boolean-expr)
+ if ((true) || !mSettings->severity.isEnabled(Severity::warning)) // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses)
return;
// logChecker
diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp
index 5f35f443cbf..dd797e19112 100644
--- a/lib/checkcondition.cpp
+++ b/lib/checkcondition.cpp
@@ -1059,7 +1059,7 @@ static bool parseComparison(const Token *comp, bool ¬1, std::string &op, std:
{
not1 = false;
while (comp && comp->str() == "!") {
- not1 = !(not1);
+ not1 = !not1;
comp = comp->astOperand1();
}
@@ -1096,7 +1096,7 @@ static bool parseComparison(const Token *comp, bool ¬1, std::string &op, std:
expr = comp;
}
- inconclusive = inconclusive || ((value)[0] == '\'' && !(op == "!=" || op == "=="));
+ inconclusive = inconclusive || (value[0] == '\'' && !(op == "!=" || op == "=="));
// Only float and int values are currently handled
return MathLib::isInt(value) || MathLib::isFloat(value) || (value[0] == '\'');
@@ -1288,13 +1288,13 @@ void CheckCondition::checkIncorrectLogicOperator()
continue;
// the expr are not the token of the value but they provide better context
- const double d1 = (isfloat) ? MathLib::toDoubleNumber(value1) : 0;
- const double d2 = (isfloat) ? MathLib::toDoubleNumber(value2) : 0;
- const MathLib::bigint i1 = (isfloat) ? 0 : MathLib::toBigNumber(value1, expr1);
- const MathLib::bigint i2 = (isfloat) ? 0 : MathLib::toBigNumber(value2, expr2);
+ const double d1 = isfloat ? MathLib::toDoubleNumber(value1) : 0;
+ const double d2 = isfloat ? MathLib::toDoubleNumber(value2) : 0;
+ const MathLib::bigint i1 = isfloat ? 0 : MathLib::toBigNumber(value1, expr1);
+ const MathLib::bigint i2 = isfloat ? 0 : MathLib::toBigNumber(value2, expr2);
const bool useUnsignedInt = (std::numeric_limits::max()==i1) || (std::numeric_limits::max()==i2);
- const MathLib::biguint u1 = (useUnsignedInt) ? MathLib::toBigUNumber(value1, expr1) : 0;
- const MathLib::biguint u2 = (useUnsignedInt) ? MathLib::toBigUNumber(value2, expr2) : 0;
+ const MathLib::biguint u1 = useUnsignedInt ? MathLib::toBigUNumber(value1, expr1) : 0;
+ const MathLib::biguint u2 = useUnsignedInt ? MathLib::toBigUNumber(value2, expr2) : 0;
// evaluate if expression is always true/false
bool alwaysTrue = true, alwaysFalse = true;
bool firstTrue = true, secondTrue = true;
diff --git a/lib/checkio.cpp b/lib/checkio.cpp
index 3662adfda8f..a250e044c9f 100644
--- a/lib/checkio.cpp
+++ b/lib/checkio.cpp
@@ -1681,7 +1681,7 @@ bool CheckIO::ArgumentInfo::isArrayOrPointer() const
bool CheckIO::ArgumentInfo::isComplexType() const
{
if (variableInfo->type())
- return (true);
+ return true;
const Token* varTypeTok = typeToken;
if (varTypeTok->str() == "std")
diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp
index bd9d1bc892f..ac6329bcf86 100644
--- a/lib/checkmemoryleak.cpp
+++ b/lib/checkmemoryleak.cpp
@@ -454,7 +454,7 @@ void CheckMemoryLeakInFunction::checkReallocUsage()
continue;
const AllocType allocType = getReallocationType(reallocTok, tok->varId());
- if (!((allocType == Malloc || allocType == OtherMem)))
+ if (!(allocType == Malloc || allocType == OtherMem))
continue;
const Token* arg = getArguments(reallocTok).at(f->reallocArg - 1);
while (arg && arg->isCast())
diff --git a/lib/checkother.cpp b/lib/checkother.cpp
index 1247d97365e..2786f5442a6 100644
--- a/lib/checkother.cpp
+++ b/lib/checkother.cpp
@@ -1468,8 +1468,8 @@ void CheckOther::variableScopeError(const Token *tok, const std::string &varname
//---------------------------------------------------------------------------
void CheckOther::checkCommaSeparatedReturn()
{
- // This is experimental for now. See #5076
- if ((true) || !mSettings->severity.isEnabled(Severity::style)) // NOLINT(readability-simplify-boolean-expr)
+ // TODO: This is experimental for now. See #5076
+ if ((true) || !mSettings->severity.isEnabled(Severity::style)) // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses)
return;
// logChecker
diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp
index dccce6ad348..8463f6a1c8e 100644
--- a/lib/checkuninitvar.cpp
+++ b/lib/checkuninitvar.cpp
@@ -1540,7 +1540,7 @@ bool CheckUninitVar::isMemberVariableUsage(const Token *tok, bool isPointer, All
return true;
// TODO: this used to be experimental - enable or remove see #5586
- if ((false) && // NOLINT(readability-simplify-boolean-expr)
+ if ((false) && // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses)
!isPointer &&
Token::Match(tok->tokAt(-2), "[(,] & %name% [,)]") &&
isVariableUsage(tok, isPointer, alloc))
diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp
index b6528d9a9e6..1c77a365a1b 100644
--- a/lib/symboldatabase.cpp
+++ b/lib/symboldatabase.cpp
@@ -1946,7 +1946,7 @@ bool SymbolDatabase::isFunction(const Token *tok, const Scope* outerScope, const
// function returning function pointer? '... ( ... %name% ( ... ))( ... ) {'
// function returning reference to array '... ( & %name% ( ... ))[ ... ] {'
// TODO: Activate this again
- if ((false) && tok->str() == "(" && tok->strAt(1) != "*" && // NOLINT(readability-simplify-boolean-expr)
+ if ((false) && tok->str() == "(" && tok->strAt(1) != "*" && // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses)
(tok->link()->strAt(-1) == ")" || Token::simpleMatch(tok->link()->tokAt(-2), ") const"))) {
const Token* tok2 = tok->link()->next();
if (tok2 && tok2->str() == "(" && Token::Match(tok2->link()->next(), "{|;|const|=")) {
diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp
index e7a096932cf..26a21ec91ad 100644
--- a/lib/templatesimplifier.cpp
+++ b/lib/templatesimplifier.cpp
@@ -2859,9 +2859,9 @@ bool TemplateSimplifier::simplifyCalculations(Token* frontToken, const Token *ba
} else if ((((Token::Match(tok->previous(), "[=[(,] 0 * %name%|%num% ,|]|)|;|=|%cop%") ||
Token::Match(tok->previous(), "return|case 0 *|&& %name%|%num% ,|:|;|=|%cop%")) &&
validTokenEnd(bounded, tok, backToken, 3)) ||
- (((Token::Match(tok->previous(), "[=[(,] 0 * (") ||
+ ((Token::Match(tok->previous(), "[=[(,] 0 * (") ||
Token::Match(tok->previous(), "return|case 0 *|&& (")) &&
- validTokenEnd(bounded, tok, backToken, 2))))) {
+ validTokenEnd(bounded, tok, backToken, 2)))) {
tok->deleteNext();
if (tok->strAt(1) == "(")
eraseTokens(tok, tok->linkAt(1));
diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp
index 8c324a72701..e9bd2a84267 100644
--- a/lib/tokenize.cpp
+++ b/lib/tokenize.cpp
@@ -195,7 +195,7 @@ bool Tokenizer::duplicateTypedef(Token *&tokPtr, const Token *name, const Token
if (end->strAt(1) == "(")
end = end->linkAt(1);
- end = (end)?end->next():nullptr;
+ end = end ? end->next() : nullptr;
}
if (end)
end = end->next();
@@ -631,7 +631,7 @@ namespace {
}
}
// TODO: handle all typedefs
- if ((false))
+ if ((false)) // NOLINT(readability-redundant-parentheses)
printTypedef(typedefToken, std::cout);
mFail = true;
}
diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp
index 023d2ebde31..8847e3f7ab0 100644
--- a/lib/valueflow.cpp
+++ b/lib/valueflow.cpp
@@ -2495,8 +2495,8 @@ static void valueFlowLifetimeFunction(Token *tok, const TokenList &tokenlist, Er
std::vector args = getArguments(tok);
const std::size_t n = args.size();
if (n > 1 && Token::typeStr(args[n - 2]) == Token::typeStr(args[n - 1]) &&
- (((astIsIterator(args[n - 2]) && astIsIterator(args[n - 1])) ||
- (astIsPointer(args[n - 2]) && astIsPointer(args[n - 1]))))) {
+ ((astIsIterator(args[n - 2]) && astIsIterator(args[n - 1])) ||
+ (astIsPointer(args[n - 2]) && astIsPointer(args[n - 1])))) {
LifetimeStore{
args.back(), "Added to container '" + memtok->str() + "'.", ValueFlow::Value::LifetimeKind::Object}
.byDerefCopy(memtok, tokenlist, errorLogger, settings);
diff --git a/lib/vf_analyzers.cpp b/lib/vf_analyzers.cpp
index 5f5568663e4..e14af7a9c98 100644
--- a/lib/vf_analyzers.cpp
+++ b/lib/vf_analyzers.cpp
@@ -1233,6 +1233,7 @@ struct SingleValueFlowAnalyzer : ValueFlowAnalyzer {
return false;
}
+private:
ValuePtr reanalyze(Token* tok, const std::string& msg) const override {
ValueFlow::Value newValue = value;
newValue.errorPath.emplace_back(tok, msg);
@@ -1431,6 +1432,7 @@ struct SubExpressionAnalyzer : ExpressionAnalyzer {
partialReads->emplace_back(tok, v);
}
+private:
// No reanalysis for subexpression
ValuePtr reanalyze(Token* /*tok*/, const std::string& /*msg*/) const override {
return {};