diff --git a/.clang-tidy b/.clang-tidy index e1032aaa5f3..71310bf70a4 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -51,7 +51,6 @@ Checks: > -modernize-use-designated-initializers, -modernize-use-nodiscard, -modernize-use-scoped-lock, - -modernize-use-trailing-return-type, -performance-avoid-endl, -performance-inefficient-string-concatenation, -performance-no-automatic-move, diff --git a/.github/workflows/CI-cygwin.yml b/.github/workflows/CI-cygwin.yml deleted file mode 100644 index 93a77d70c33..00000000000 --- a/.github/workflows/CI-cygwin.yml +++ /dev/null @@ -1,61 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: CI-cygwin - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -defaults: - run: - shell: cmd - -jobs: - # TODO: add CMake build - build_cygwin: - strategy: - matrix: - # only use the latest windows-* as the installed toolchain is identical - os: [windows-2025] - platform: [x86_64] - include: - - platform: 'x86_64' - packages: | - gcc-g++ - python3 - fail-fast: false - - runs-on: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Set up Cygwin - uses: cygwin/cygwin-install-action@master - with: - platform: ${{ matrix.platform }} - packages: ${{ matrix.packages }} - - # Cygwin will always link the binaries even if they already exist. The linking is also extremely slow. So just run the "check" target which includes all the binaries. - - name: Build all and run test - run: | - C:\cygwin\bin\bash.exe -l -c cd %GITHUB_WORKSPACE% && make VERBOSE=1 -j%NUMBER_OF_PROCESSORS% check - - - name: Extra test for misra - run: | - cd %GITHUB_WORKSPACE%\addons\test - ..\..\cppcheck.exe --dump -DDUMMY --suppress=uninitvar --inline-suppr misra\misra-test.c --std=c89 --platform=unix64 - python3 ..\misra.py -verify misra\misra-test.c.dump - ..\..\cppcheck.exe --addon=misra --enable=style --inline-suppr --enable=information --error-exitcode=1 misra\misra-ctu-1-test.c misra\misra-ctu-2-test.c - diff --git a/.github/workflows/CI-mingw.yml b/.github/workflows/CI-mingw.yml deleted file mode 100644 index a8c27b17224..00000000000 --- a/.github/workflows/CI-mingw.yml +++ /dev/null @@ -1,79 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: CI-mingw - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -defaults: - run: - shell: msys2 {0} - -jobs: - # TODO: add CMake build - build_mingw: - strategy: - matrix: - # only use the latest windows-* as the installed toolchain is identical - os: [windows-2025] - fail-fast: false - - runs-on: ${{ matrix.os }} - - timeout-minutes: 19 # max + 3*std of the last 7K runs - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Set up MSYS2 - uses: msys2/setup-msys2@v2 - with: - release: false # use pre-installed - # TODO: install mingw-w64-x86_64-make and use mingw32.make instead - currently fails with "Windows Subsystem for Linux has no installed distributions." - install: >- - mingw-w64-x86_64-lld - mingw-w64-x86_64-ccache - make - mingw-w64-x86_64-gcc - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ github.job }}-${{ matrix.os }} - - # TODO: bail out on warning - - name: Build cppcheck - run: | - export PATH="/mingw64/lib/ccache/bin:$PATH" - # set RDYNAMIC to work around broken MinGW detection - make VERBOSE=1 RDYNAMIC=-lshlwapi -j$(nproc) cppcheck - env: - LDFLAGS: -fuse-ld=lld # use lld for faster linking - - - name: Build test - run: | - export PATH="/mingw64/lib/ccache/bin:$PATH" - # set RDYNAMIC to work around broken MinGW detection - make VERBOSE=1 RDYNAMIC=-lshlwapi -j$(nproc) testrunner - env: - LDFLAGS: -fuse-ld=lld # use lld for faster linking - - - name: Run test - run: | - export PATH="/mingw64/lib/ccache/bin:$PATH" - # set RDYNAMIC to work around broken MinGW detection - make VERBOSE=1 RDYNAMIC=-lshlwapi -j$(nproc) check - env: - LDFLAGS: -fuse-ld=lld # use lld for faster linking diff --git a/.github/workflows/CI-unixish-docker.yml b/.github/workflows/CI-unixish-docker.yml deleted file mode 100644 index f8a74b4d8f7..00000000000 --- a/.github/workflows/CI-unixish-docker.yml +++ /dev/null @@ -1,140 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: CI-unixish-docker - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -jobs: - build_cmake: - - strategy: - matrix: - image: ["ubuntu:24.04", "ubuntu:24.10"] - include: - - build_gui: false - - image: "ubuntu:24.04" - build_gui: true - - image: "ubuntu:24.10" - build_gui: true - fail-fast: false # Prefer quick result - - runs-on: ubuntu-22.04 - - # TODO: is this actually applied to the guest? - env: - # TODO: figure out why there are cache misses with PCH enabled - CCACHE_SLOPPINESS: pch_defines,time_macros - - container: - image: ${{ matrix.image }} - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Install missing software on ubuntu - if: contains(matrix.image, 'ubuntu') - run: | - apt-get update - apt-get install -y cmake g++ make libxml2-utils libpcre3-dev - - - name: Install missing software (gui) on latest ubuntu - if: matrix.build_gui - run: | - apt-get install -y qt6-base-dev qt6-charts-dev qt6-tools-dev - - # needs to be called after the package installation since - # - it doesn't call "apt-get update" - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ matrix.image }} - - - name: CMake build - if: ${{ !matrix.build_gui }} - run: | - mkdir cmake.output - cd cmake.output - cmake -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache .. - cmake --build . -- -j$(nproc) - - - name: CMake build (with GUI) - if: matrix.build_gui - run: | - cmake -S . -B cmake.output -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - cmake --build cmake.output -- -j$(nproc) - - - name: Run CMake test - run: | - cmake --build cmake.output --target check -- -j$(nproc) - - build_make: - - strategy: - matrix: - image: ["ubuntu:24.04", "ubuntu:24.10"] - fail-fast: false # Prefer quick result - - runs-on: ubuntu-22.04 - - container: - image: ${{ matrix.image }} - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Install missing software on ubuntu - if: contains(matrix.image, 'ubuntu') - run: | - apt-get update - apt-get install -y g++ make python3 libxml2-utils libpcre3-dev - - # needs to be called after the package installation since - # - it doesn't call "apt-get update" - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ matrix.image }} - - - name: Build cppcheck - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - make -j$(nproc) HAVE_RULES=yes CXXFLAGS="-w" - - - name: Build test - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - make -j$(nproc) testrunner HAVE_RULES=yes CXXFLAGS="-w" - - - name: Run test - run: | - make -j$(nproc) check HAVE_RULES=yes - - # requires python3 - - name: Run extra tests - run: | - test/scripts/generate_and_run_more_tests.sh - - # requires which - - name: Validate - run: | - make -j$(nproc) checkCWEEntries validateXML - - - name: Test addons - run: | - ./cppcheck --addon=threadsafety addons/test/threadsafety - ./cppcheck --addon=threadsafety --std=c++03 addons/test/threadsafety diff --git a/.github/workflows/CI-unixish.yml b/.github/workflows/CI-unixish.yml deleted file mode 100644 index 9b720b95b4a..00000000000 --- a/.github/workflows/CI-unixish.yml +++ /dev/null @@ -1,612 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: CI-unixish - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -jobs: - build_cmake_tinyxml2: - - strategy: - matrix: - os: [ubuntu-22.04, macos-13, macos-15] - fail-fast: false # Prefer quick result - - runs-on: ${{ matrix.os }} - - env: - # TODO: figure out why there are cache misses with PCH enabled - CCACHE_SLOPPINESS: pch_defines,time_macros - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ github.job }}-${{ matrix.os }} - - - name: Install missing software on ubuntu - if: contains(matrix.os, 'ubuntu') - run: | - sudo apt-get update - sudo apt-get install libxml2-utils libtinyxml2-dev - # qt6-tools-dev-tools for lprodump - # qt6-l10n-tools for lupdate - sudo apt-get install qt6-base-dev libqt6charts6-dev qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools libglx-dev libgl1-mesa-dev - - # coreutils contains "nproc" - - name: Install missing software on macos - if: contains(matrix.os, 'macos') - run: | - # pcre was removed from runner images in November 2022 - brew install coreutils qt@6 tinyxml2 pcre - - - name: CMake build on ubuntu (with GUI / system tinyxml2) - if: contains(matrix.os, 'ubuntu') - run: | - cmake -S . -B cmake.output.tinyxml2 -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_BUNDLED_TINYXML2=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - cmake --build cmake.output.tinyxml2 -- -j$(nproc) - - - name: CMake build on macos (with GUI / system tinyxml2) - if: contains(matrix.os, 'macos') - run: | - cmake -S . -B cmake.output.tinyxml2 -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_BUNDLED_TINYXML2=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DQt6_DIR=$(brew --prefix qt@6)/lib/cmake/Qt6 - cmake --build cmake.output.tinyxml2 -- -j$(nproc) - - - name: Run CMake test (system tinyxml2) - run: | - cmake --build cmake.output.tinyxml2 --target check -- -j$(nproc) - - build_cmake: - - strategy: - matrix: - os: [ubuntu-22.04, macos-13, macos-15] - fail-fast: false # Prefer quick result - - runs-on: ${{ matrix.os }} - - env: - # TODO: figure out why there are cache misses with PCH enabled - CCACHE_SLOPPINESS: pch_defines,time_macros - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ github.job }}-${{ matrix.os }} - - # TODO: move latest compiler to separate step - # TODO: bail out on warnings with latest GCC - - name: Set up GCC - uses: egor-tensin/setup-gcc@v1 - if: false # matrix.os == 'ubuntu-22.04' - with: - version: 13 - platform: x64 - - - name: Select compiler - if: false # matrix.os == 'ubuntu-22.04' - run: | - echo "CXX=g++-13" >> $GITHUB_ENV - - - name: Install missing software on ubuntu - if: contains(matrix.os, 'ubuntu') - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - # qt6-tools-dev-tools for lprodump - # qt6-l10n-tools for lupdate - sudo apt-get install qt6-base-dev libqt6charts6-dev qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools libglx-dev libgl1-mesa-dev - - # coreutils contains "nproc" - - name: Install missing software on macos - if: contains(matrix.os, 'macos') - run: | - # pcre was removed from runner images in November 2022 - brew install coreutils qt@6 pcre - - - name: Run CMake on ubuntu (with GUI) - if: contains(matrix.os, 'ubuntu') - run: | - cmake -S . -B cmake.output -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_INSTALL_PREFIX=cppcheck-cmake-install - - - name: Run CMake on macos (with GUI) - if: contains(matrix.os, 'macos') - run: | - cmake -S . -B cmake.output -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_INSTALL_PREFIX=cppcheck-cmake-install -DQt6_DIR=$(brew --prefix qt@6)/lib/cmake/Qt6 - - - name: Run CMake build - run: | - cmake --build cmake.output -- -j$(nproc) - - - name: Run CMake test - run: | - cmake --build cmake.output --target check -- -j$(nproc) - - - name: Run CTest - run: | - pushd cmake.output - ctest --output-on-failure -j$(nproc) - - - name: Run CMake install - run: | - cmake --build cmake.output --target install - - build_uchar: - - strategy: - matrix: - os: [ubuntu-22.04, macos-13, macos-15] - fail-fast: false # Prefer quick result - - runs-on: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ github.job }}-${{ matrix.os }} - - # coreutils contains "nproc" - - name: Install missing software on macos - if: contains(matrix.os, 'macos') - run: | - brew install coreutils - - - name: Build with Unsigned char - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - make -j$(nproc) CXXFLAGS=-funsigned-char testrunner - - - name: Test with Unsigned char - run: | - ./testrunner TestSymbolDatabase - - build_mathlib: - - strategy: - matrix: - os: [ubuntu-22.04, macos-13, macos-15] - fail-fast: false # Prefer quick result - - runs-on: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ github.job }}-${{ matrix.os }} - - # coreutils contains "nproc" - - name: Install missing software on macos - if: contains(matrix.os, 'macos') - run: | - brew install coreutils - - - name: Build with TEST_MATHLIB_VALUE - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - make -j$(nproc) CPPFLAGS=-DTEST_MATHLIB_VALUE all - - - name: Test with TEST_MATHLIB_VALUE - run: | - make -j$(nproc) CPPFLAGS=-DTEST_MATHLIB_VALUE check - - check_nonneg: - - strategy: - matrix: - os: [ubuntu-22.04, macos-13, macos-15] - fail-fast: false # Prefer quick result - - runs-on: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - # coreutils contains "g++" (default is "c++") and "nproc" - - name: Install missing software on macos - if: contains(matrix.os, 'macos') - run: | - brew install coreutils - - - name: Check syntax with NONNEG - run: | - ls lib/*.cpp | xargs -n 1 -P $(nproc) g++ -fsyntax-only -std=c++0x -Ilib -Iexternals -Iexternals/picojson -Iexternals/simplecpp -Iexternals/tinyxml2 -DNONNEG - - build_cmake_boost: - - strategy: - matrix: - os: [macos-13, macos-15] # non-macos platforms are already built with Boost in other contexts - fail-fast: false # Prefer quick result - - runs-on: ${{ matrix.os }} - - env: - # TODO: figure out why there are cache misses with PCH enabled - CCACHE_SLOPPINESS: pch_defines,time_macros - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ github.job }}-${{ matrix.os }} - - - name: Run CMake on macOS (force Boost) - run: | - # make sure we fail when Boost is requested and not available. - # will fail because no package configuration is available. - if cmake -S . -B cmake.output.boost-force-noavail -G "Unix Makefiles" -DUSE_BOOST=On; then - exit 1 - else - exit 0 - fi - - # coreutils contains "nproc" - - name: Install missing software on macOS - run: | - brew install coreutils boost - - - name: Run CMake on macOS (force Boost) - run: | - cmake -S . -B cmake.output.boost-force -G "Unix Makefiles" -DUSE_BOOST=On - - - name: Run CMake on macOS (no Boost) - run: | - # make sure Boost is not used when disabled even though it is available - cmake -S . -B cmake.output.boost-no -G "Unix Makefiles" -DUSE_BOOST=Off - if grep -q '\-DHAVE_BOOST' ./cmake.output.boost-no/compile_commands.json; then - exit 1 - else - exit 0 - fi - - - name: Run CMake on macOS (with Boost) - run: | - cmake -S . -B cmake.output.boost -G "Unix Makefiles" -DBUILD_TESTS=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - grep -q '\-DHAVE_BOOST' ./cmake.output.boost/compile_commands.json - - - name: Build with CMake on macOS (with Boost) - run: | - cmake --build cmake.output.boost -- -j$(nproc) - - build: - - strategy: - matrix: - os: [ubuntu-22.04, macos-13, macos-15] - include: - - xdist_n: auto - # FIXME: test_color_tty fails with xdist - - os: macos-13 - xdist_n: '1' - fail-fast: false # Prefer quick result - - runs-on: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ github.job }}-${{ matrix.os }} - - - name: Install missing software on ubuntu - if: contains(matrix.os, 'ubuntu') - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - # packages for strict cfg checks - - name: Install missing software on ubuntu 22.04 (cfg) - if: matrix.os == 'ubuntu-22.04' - run: | - sudo apt-get install libcairo2-dev libcurl4-openssl-dev liblua5.3-dev libssl-dev libsqlite3-dev libcppunit-dev libsigc++-2.0-dev libgtk-3-dev libboost-all-dev libselinux-dev libwxgtk3.0-gtk3-dev xmlstarlet qtbase5-dev - - # coreutils contains "nproc" - - name: Install missing software on macos - if: contains(matrix.os, 'macos') - run: | - # pcre was removed from runner images in November 2022 - brew install coreutils pcre gnu-sed - - - name: Install missing Python packages on ubuntu - if: contains(matrix.os, 'ubuntu') - run: | - python3 -m pip install pip --upgrade - python3 -m pip install pytest - python3 -m pip install pytest-timeout - python3 -m pip install pytest-xdist - python3 -m pip install psutil - - # we need to use -break-system-packages --user because the common approaches do not work. - # using pip works but it appears to install the packages into a different Python installation so they are not found later on. - # using python3 -m pip without the additional flags fails since the packages are being managed by a different tool (brew) and that lacks some of the packages. - # using pipx also does not work. - - name: Install missing Python packages on macos - if: contains(matrix.os, 'macos') - run: | - python3 -m pip install --break-system-packages --user pip --upgrade - python3 -m pip install --break-system-packages --user pytest - python3 -m pip install --break-system-packages --user pytest-timeout - python3 -m pip install --break-system-packages --user pytest-xdist - python3 -m pip install --break-system-packages --user psutil - - - name: Build cppcheck - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - make -j$(nproc) HAVE_RULES=yes - - - name: Build test - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - make -j$(nproc) testrunner HAVE_RULES=yes - - - name: Run test - run: | - make -j$(nproc) check HAVE_RULES=yes - - # requires "gnu-sed" installed on macos - - name: Run extra tests - run: | - test/scripts/generate_and_run_more_tests.sh - - - name: Run test/cli - run: | - python3 -m pytest -Werror --strict-markers -vv -n ${{ matrix.xdist_n }} test/cli - - # TODO: use the step below instead - # do not use pushd in this step since we go below the working directory - - name: Run test/cli (symlink) - run: | - cd .. - ln -s cppcheck 'cpp check' - cd 'cpp check/test/cli' - python3 -m pytest -Werror --strict-markers -vv -n ${{ matrix.xdist_n }} - - # FIXME: proj2_test.py fails because of the relative path cleanups in ImportProject::setRelativePaths() - # It fails because the application path used as base path has its symlink resolved by getcwd(). - - name: Run test/cli (symlink) - if: false - run: | - ln -s . 'cpp check' - python3 -m pytest -Werror --strict-markers -vv -n ${{ matrix.xdist_n }} 'cpp check/test/cli' - - - name: Run test/cli (-j2) - run: | - python3 -m pytest -Werror --strict-markers -vv -n ${{ matrix.xdist_n }} test/cli - env: - TEST_CPPCHECK_INJECT_J: 2 - - - name: Run test/cli (--clang) - if: false - run: | - python3 -m pytest -Werror --strict-markers -vv -n ${{ matrix.xdist_n }} test/cli - env: - TEST_CPPCHECK_INJECT_CLANG: clang - - - name: Run test/cli (--cppcheck-build-dir) - run: | - python3 -m pytest -Werror --strict-markers -vv -n ${{ matrix.xdist_n }} test/cli - env: - TEST_CPPCHECK_INJECT_BUILDDIR: injected - - - name: Run cfg tests - if: matrix.os != 'ubuntu-22.04' - run: | - make -j$(nproc) checkcfg - - - name: Run cfg tests (strict) - if: matrix.os == 'ubuntu-22.04' - run: | - make -j$(nproc) checkcfg - env: - STRICT: 1 - - - name: Run --dump test - run: | - ./cppcheck test/testpreprocessor.cpp --dump - xmllint --noout test/testpreprocessor.cpp.dump - - - name: Validate - run: | - make -j$(nproc) checkCWEEntries validateXML - - - name: Test install - run: | - # this is only to test the "install" target - since we did not build with FILESDIR it would not work as intended - make DESTDIR=cppcheck-make-install FILESDIR=/share/Cppcheck install - rm -rf cppcheck-make-install - - - name: Test Signalhandler - run: | - cmake -S . -B build.cmake.signal -G "Unix Makefiles" -DBUILD_TESTS=On - cmake --build build.cmake.signal --target test-signalhandler -- -j$(nproc) - # TODO: how to run this without copying the file? - cp build.cmake.signal/bin/test-s* . - python3 -m pytest -Werror --strict-markers -vv test/signal/test-signalhandler.py - rm test-signalhandler - - # no unix backtrace support on MacOs - - name: Test Stacktrace - if: contains(matrix.os, 'ubuntu') - run: | - cmake -S . -B build.cmake.stack -G "Unix Makefiles" -DBUILD_TESTS=On - cmake --build build.cmake.stack --target test-stacktrace -- -j$(nproc) - # TODO: how to run this without copying the file? - cp build.cmake.stack/bin/test-s* . - python3 -m pytest -Werror --strict-markers -vv test/signal/test-stacktrace.py - rm test-stacktrace - - # TODO: move to scriptcheck.yml so these are tested with all Python versions? - - name: Test addons - run: | - set -x - ./cppcheck --error-exitcode=1 --inline-suppr --addon=threadsafety addons/test/threadsafety - ./cppcheck --error-exitcode=1 --inline-suppr --addon=threadsafety --std=c++03 addons/test/threadsafety - ./cppcheck --error-exitcode=1 --inline-suppr --addon=misra addons/test/misra/crash*.c - ./cppcheck --error-exitcode=1 --inline-suppr --addon=misra --enable=information addons/test/misra/config*.c - - ./cppcheck --addon=misra --enable=style --inline-suppr --enable=information --error-exitcode=1 addons/test/misra/misra-ctu-*-test.c - pushd addons/test - # We'll force C89 standard to enable an additional verification for - # rules 5.4 and 5.5 which have standard-dependent options. - ../../cppcheck --dump -DDUMMY --suppress=uninitvar --inline-suppr misra/misra-test.c --std=c89 --platform=unix64 - python3 ../misra.py -verify misra/misra-test.c.dump - # Test slight MISRA differences in C11 standard - ../../cppcheck --dump -DDUMMY --suppress=uninitvar --inline-suppr misra/misra-test-c11.c --std=c11 --platform=unix64 - python3 ../misra.py -verify misra/misra-test-c11.c.dump - # TODO: do we need to verify something here? - ../../cppcheck --dump -DDUMMY --suppress=uninitvar --suppress=uninitStructMember --std=c89 misra/misra-test.h - ../../cppcheck --dump misra/misra-test.cpp - python3 ../misra.py -verify misra/misra-test.cpp.dump - python3 ../misra.py --rule-texts=misra/misra2012_rules_dummy_ascii.txt -verify misra/misra-test.cpp.dump - python3 ../misra.py --rule-texts=misra/misra2012_rules_dummy_utf8.txt -verify misra/misra-test.cpp.dump - python3 ../misra.py --rule-texts=misra/misra2012_rules_dummy_windows1250.txt -verify misra/misra-test.cpp.dump - ../../cppcheck --addon=misra --enable=style --platform=avr8 --error-exitcode=1 misra/misra-test-avr8.c - ../../cppcheck --dump misc-test.cpp - python3 ../misc.py -verify misc-test.cpp.dump - ../../cppcheck --dump naming_test.c - python3 ../naming.py --var='[a-z].*' --function='[a-z].*' naming_test.c.dump - ../../cppcheck --dump naming_test.cpp - python3 ../naming.py --var='[a-z].*' --function='[a-z].*' naming_test.cpp.dump - - # TODO: run with "-n auto" when misra_test.py can be run in parallel - - name: test addons (Python) - if: matrix.os != 'ubuntu-22.04' - run: | - python3 -m pytest -Werror --strict-markers -vv -n 1 addons/test - env: - PYTHONPATH: ./addons - - # TODO: run with "-n auto" when misra_test.py can be run in parallel - # we cannot specify -Werror since xml/etree/ElementTree.py in Python 3.10 contains an unclosed file - - name: test addons (Python) - if: matrix.os == 'ubuntu-22.04' - run: | - python3 -m pytest --strict-markers -vv -n 1 addons/test - env: - PYTHONPATH: ./addons - - - name: Build democlient - if: matrix.os == 'ubuntu-22.04' - run: | - warnings="-pedantic -Wall -Wextra -Wcast-qual -Wno-deprecated-declarations -Wfloat-equal -Wmissing-declarations -Wmissing-format-attribute -Wno-long-long -Wpacked -Wredundant-decls -Wundef -Wno-shadow -Wno-missing-field-initializers -Wno-missing-braces -Wno-sign-compare -Wno-multichar" - g++ $warnings -c -Ilib -Iexternals/tinyxml2 democlient/democlient.cpp - - - name: Show all ignored files - if: false # TODO: currently lists all the contents of ignored folders - we only need what actually matched - run: | - git ls-files --others --ignored --exclude-standard - - - name: Check for changed and unversioned files - run: | - # TODO: how to do this with a single command? - git status --ignored=no - git status --ignored=no | grep -q 'working tree clean' - - selfcheck: - needs: build # wait for all tests to be successful first - - runs-on: ubuntu-22.04 # run on the latest image only - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ github.job }}-${{ matrix.os }} - - - name: Install missing software on ubuntu - run: | - sudo apt-get update - # qt6-tools-dev-tools for lprodump - # qt6-l10n-tools for lupdate - sudo apt-get install qt6-base-dev libqt6charts6-dev qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools libglx-dev libgl1-mesa-dev - sudo apt-get install libboost-container-dev - - - name: Self check (build) - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - # compile with verification and ast matchers - make -j$(nproc) -s CPPFLAGS="-DCHECK_INTERNAL" CXXFLAGS="-g -O2 -w -DHAVE_BOOST" MATCHCOMPILER=yes VERIFY=1 - - - name: CMake - run: | - cmake -S . -B cmake.output -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DUSE_QT6=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_MATCHCOMPILER=Verify -DENABLE_CHECK_INTERNAL=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On - - - name: Generate dependencies - run: | - # make sure auto-generated GUI files exist - make -C cmake.output autogen - make -C cmake.output gui-build-deps triage-build-ui-deps - - - name: Self check - run: | - selfcheck_options="-q -j$(nproc) --std=c++11 --template=selfcheck --showtime=file-total -D__GNUC__ --error-exitcode=1 --inline-suppr --suppressions-list=.selfcheck_suppressions --library=gnu --inconclusive --enable=style,performance,portability,warning,missingInclude --exception-handling --debug-warnings --check-level=exhaustive" - cppcheck_options="-D__CPPCHECK__ -DCHECK_INTERNAL -DHAVE_RULES --library=cppcheck-lib -Ilib -Iexternals/simplecpp/ -Iexternals/tinyxml2" - ec=0 - - # TODO: add --check-config - - # early exit - if [ $ec -eq 1 ]; then - exit $ec - fi - - # self check externals - ./cppcheck $selfcheck_options externals || ec=1 - # self check lib/cli - mkdir b1 - ./cppcheck $selfcheck_options $cppcheck_options --cppcheck-build-dir=b1 --addon=naming.json frontend || ec=1 - ./cppcheck $selfcheck_options $cppcheck_options --cppcheck-build-dir=b1 --addon=naming.json -Ifrontend cli || ec=1 - ./cppcheck $selfcheck_options $cppcheck_options --cppcheck-build-dir=b1 --addon=naming.json --enable=internal lib || ec=1 - # check gui with qt settings - mkdir b2 - ./cppcheck $selfcheck_options $cppcheck_options --cppcheck-build-dir=b2 -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=68 -DQT_CHARTS_LIB --library=qt --addon=naming.json -Icmake.output/gui -Ifrontend -Igui gui/*.cpp cmake.output/gui || ec=1 - # self check test and tools - ./cppcheck $selfcheck_options $cppcheck_options -Ifrontend -Icli test/*.cpp || ec=1 - ./cppcheck $selfcheck_options $cppcheck_options -Icli tools/dmake/*.cpp || ec=1 - # triage - ./cppcheck $selfcheck_options $cppcheck_options -DQ_MOC_OUTPUT_REVISION=68 -DQT_CHARTS_LIB --library=qt -Icmake.output/tools/triage -Igui tools/triage/*.cpp cmake.output/tools/triage || ec=1 - exit $ec diff --git a/.github/workflows/CI-windows.yml b/.github/workflows/CI-windows.yml deleted file mode 100644 index 3cf7d66a8fc..00000000000 --- a/.github/workflows/CI-windows.yml +++ /dev/null @@ -1,273 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: CI-windows - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -defaults: - run: - shell: cmd - -# TODO: choose/add a step to bail out on compiler warnings (maybe even the release build) - -jobs: - - build_qt: - strategy: - matrix: - os: [windows-2022, windows-2025] - qt_ver: [6.9.1] - fail-fast: false - - runs-on: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Set up Visual Studio environment - uses: ilammy/msvc-dev-cmd@v1 - with: - arch: x64 - - - name: Install Qt ${{ matrix.qt_ver }} - uses: jurplel/install-qt-action@v4 - with: - version: ${{ matrix.qt_ver }} - modules: 'qtcharts' - setup-python: 'false' - cache: true - aqtversion: '==3.1.*' # TODO: remove when aqtinstall 3.2.2 is available - - - name: Run CMake - run: | - rem TODO: enable rules? - rem specify Release build so matchcompiler is used - cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DBUILD_ONLINE_HELP=On -DCMAKE_INSTALL_PREFIX=cppcheck-cmake-install || exit /b !errorlevel! - - - name: Build GUI release - run: | - cmake --build build --target cppcheck-gui --config Release || exit /b !errorlevel! - - - name: Deploy GUI - run: | - windeployqt build\bin\Release || exit /b !errorlevel! - del build\bin\Release\cppcheck-gui.ilk || exit /b !errorlevel! - del build\bin\Release\cppcheck-gui.pdb || exit /b !errorlevel! - - # TODO: run GUI tests - - - name: Run CMake install - run: | - cmake --build build --target install - - build: - strategy: - matrix: - os: [windows-2022, windows-2025] - config: [debug, release] - fail-fast: false - - runs-on: ${{ matrix.os }} - - env: - # see https://www.pcre.org/original/changelog.txt - PCRE_VERSION: 8.45 - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Set up Python 3.13 - if: matrix.config == 'release' - uses: actions/setup-python@v5 - with: - python-version: '3.13' - check-latest: true - - - name: Set up Visual Studio environment - uses: ilammy/msvc-dev-cmd@v1 - with: - arch: x64 - - - name: Cache PCRE - id: cache-pcre - uses: actions/cache@v4 - with: - path: | - externals\pcre.h - externals\pcre.lib - externals\pcre64.lib - key: pcre-${{ env.PCRE_VERSION }}-x64-bin-win - - - name: Download PCRE - if: steps.cache-pcre.outputs.cache-hit != 'true' - run: | - curl -fsSL https://github.com/pfultz2/pcre/archive/refs/tags/%PCRE_VERSION%.zip -o pcre-%PCRE_VERSION%.zip || exit /b !errorlevel! - - - name: Install PCRE - if: steps.cache-pcre.outputs.cache-hit != 'true' - run: | - @echo on - 7z x pcre-%PCRE_VERSION%.zip || exit /b !errorlevel! - cd pcre-%PCRE_VERSION% || exit /b !errorlevel! - git apply --ignore-space-change ..\externals\pcre.patch || exit /b !errorlevel! - cmake . -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DPCRE_BUILD_PCRECPP=Off -DPCRE_BUILD_TESTS=Off -DPCRE_BUILD_PCREGREP=Off -DCMAKE_POLICY_VERSION_MINIMUM=3.5 || exit /b !errorlevel! - nmake || exit /b !errorlevel! - copy pcre.h ..\externals || exit /b !errorlevel! - copy pcre.lib ..\externals\pcre64.lib || exit /b !errorlevel! - env: - CL: /MP - - - name: Install missing Python packages - if: matrix.config == 'release' - run: | - python -m pip install pip --upgrade || exit /b !errorlevel! - python -m pip install pytest || exit /b !errorlevel! - python -m pip install pytest-custom_exit_code || exit /b !errorlevel! - python -m pip install pytest-timeout || exit /b !errorlevel! - python -m pip install pytest-xdist || exit /b !errorlevel! - python -m pip install psutil || exit /b !errorlevel! - - # TODO: build with CMake - - - name: Build CLI debug configuration using MSBuild - if: matrix.config == 'debug' - run: | - :: cmake --build build --target check --config Debug || exit /b !errorlevel! - msbuild -m cppcheck.sln /p:Configuration=Debug-PCRE;Platform=x64 -maxcpucount || exit /b !errorlevel! - env: - _CL_: /WX - - - name: Run Debug test - if: matrix.config == 'debug' - run: .\bin\debug\testrunner.exe || exit /b !errorlevel! - - - name: Build CLI release configuration using MSBuild - if: matrix.config == 'release' - run: | - :: cmake --build build --target check --config Release || exit /b !errorlevel! - msbuild -m cppcheck.sln /p:Configuration=Release-PCRE;Platform=x64 -maxcpucount || exit /b !errorlevel! - env: - _CL_: /WX - - - name: Run Release test - if: matrix.config == 'release' - run: .\bin\testrunner.exe || exit /b !errorlevel! - - - name: Prepare test/cli - if: matrix.config == 'release' - run: | - :: since FILESDIR is not set copy the binary to the root so the addons are found - :: copy .\build\bin\Release\cppcheck.exe .\cppcheck.exe || exit /b !errorlevel! - copy .\bin\cppcheck.exe .\cppcheck.exe || exit /b !errorlevel! - copy .\bin\cppcheck-core.dll .\cppcheck-core.dll || exit /b !errorlevel! - - - name: Run test/cli - if: matrix.config == 'release' - run: | - python -m pytest -Werror --strict-markers -vv -n auto test/cli || exit /b !errorlevel! - - - name: Run test/cli (-j2) - if: matrix.config == 'release' - run: | - python -m pytest -Werror --strict-markers -vv -n auto test/cli || exit /b !errorlevel! - env: - TEST_CPPCHECK_INJECT_J: 2 - - # TODO: install clang - - name: Run test/cli (--clang) - if: false # matrix.config == 'release' - run: | - python -m pytest -Werror --strict-markers -vv -n auto test/cli || exit /b !errorlevel! - env: - TEST_CPPCHECK_INJECT_CLANG: clang - - - name: Run test/cli (--cppcheck-build-dir) - if: matrix.config == 'release' - run: | - python -m pytest -Werror --strict-markers -vv -n auto test/cli || exit /b !errorlevel! - env: - TEST_CPPCHECK_INJECT_BUILDDIR: injected - - # TODO: test with Release configuration? - - name: Test SEH wrapper - if: matrix.config == 'release' - run: | - cmake -S . -B build.cmake.seh -DBUILD_TESTS=On || exit /b !errorlevel! - cmake --build build.cmake.seh --target test-sehwrapper || exit /b !errorlevel! - :: TODO: how to run this without copying the file? - copy build.cmake.seh\bin\Debug\test-sehwrapper.exe . || exit /b !errorlevel! - python3 -m pytest -Werror --strict-markers -vv test/seh/test-sehwrapper.py || exit /b !errorlevel! - del test-sehwrapper.exe || exit /b !errorlevel! - - - name: Test addons - if: matrix.config == 'release' - run: | - echo on - .\cppcheck --addon=threadsafety addons\test\threadsafety || exit /b !errorlevel! - .\cppcheck --addon=threadsafety --std=c++03 addons\test\threadsafety || exit /b !errorlevel! - .\cppcheck --addon=misra --enable=style --inline-suppr --enable=information --error-exitcode=1 addons\test\misra\misra-ctu-*-test.c || exit /b !errorlevel! - cd addons\test - rem We'll force C89 standard to enable an additional verification for - rem rules 5.4 and 5.5 which have standard-dependent options. - ..\..\cppcheck --dump -DDUMMY --suppress=uninitvar --inline-suppr misra\misra-test.c --std=c89 --platform=unix64 || exit /b !errorlevel! - python3 ..\misra.py -verify misra\misra-test.c.dump || exit /b !errorlevel! - rem Test slight MISRA differences in C11 standard - ..\..\cppcheck --dump -DDUMMY --suppress=uninitvar --inline-suppr misra\misra-test-c11.c --std=c11 --platform=unix64 || exit /b !errorlevel! - python3 ..\misra.py -verify misra\misra-test-c11.c.dump || exit /b !errorlevel! - rem TODO: do we need to verify something here? - ..\..\cppcheck --dump -DDUMMY --suppress=uninitvar --suppress=uninitStructMember --std=c89 misra\misra-test.h || exit /b !errorlevel! - ..\..\cppcheck --dump misra\misra-test.cpp || exit /b !errorlevel! - python3 ..\misra.py -verify misra\misra-test.cpp.dump || exit /b !errorlevel! - python3 ..\misra.py --rule-texts=misra\misra2012_rules_dummy_ascii.txt -verify misra\misra-test.cpp.dump || exit /b !errorlevel! - python3 ..\misra.py --rule-texts=misra\misra2012_rules_dummy_utf8.txt -verify misra\misra-test.cpp.dump || exit /b !errorlevel! - python3 ..\misra.py --rule-texts=misra\misra2012_rules_dummy_windows1250.txt -verify misra\misra-test.cpp.dump || exit /b !errorlevel! - ..\..\cppcheck --addon=misra --enable=style --platform=avr8 --error-exitcode=1 misra\misra-test-avr8.c || exit /b !errorlevel! - ..\..\cppcheck --dump misc-test.cpp || exit /b !errorlevel! - python3 ..\misc.py -verify misc-test.cpp.dump || exit /b !errorlevel! - ..\..\cppcheck --dump naming_test.c || exit /b !errorlevel! - rem TODO: fix this - does not fail on Linux - rem python3 ..\naming.py --var='[a-z].*' --function='[a-z].*' naming_test.c.dump || exit /b !errorlevel! - ..\..\cppcheck --dump naming_test.cpp || exit /b !errorlevel! - python3 ..\naming.py --var='[a-z].*' --function='[a-z].*' naming_test.cpp.dump || exit /b !errorlevel! - - # TODO: run with "-n auto" when misra_test.py can be run in parallel - - name: test addons (Python) - if: matrix.config == 'release' - run: | - python -m pytest -Werror --strict-markers -vv -n 1 addons/test || exit /b !errorlevel! - env: - PYTHONPATH: ./addons - - - name: Check Windows test syntax - if: matrix.config == 'debug' - run: | - cd test\cfg - cl.exe windows.cpp -DUNICODE=1 -D_UNICODE=1 /Zs || exit /b !errorlevel! - cl.exe mfc.cpp /EHsc /Zs || exit /b !errorlevel! - - - name: Show all ignored files - if: false # TODO: currently lists all the contents of ignored folders - we only need what actually matched - run: | - git ls-files --others --ignored --exclude-standard || exit /b !errorlevel! - - - name: Check for changed and unversioned files - run: | - :: TODO: how to do this with a single command? - git status --ignored=no - :: TODO: make this work - :: git status --ignored=no | grep -q 'working tree clean' diff --git a/.github/workflows/asan.yml b/.github/workflows/asan.yml deleted file mode 100644 index 06bd57e69d5..00000000000 --- a/.github/workflows/asan.yml +++ /dev/null @@ -1,155 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: address sanitizer - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -jobs: - build: - - runs-on: ubuntu-22.04 - - env: - QT_VERSION: 6.9.1 - ASAN_OPTIONS: detect_stack_use_after_return=1 - # TODO: figure out why there are cache misses with PCH enabled - CCACHE_SLOPPINESS: pch_defines,time_macros - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ github.job }}-${{ matrix.os }} - - - name: Set up Python 3.13 - uses: actions/setup-python@v5 - with: - python-version: '3.13' - check-latest: true - - - name: Install missing software on ubuntu - run: | - sudo apt-get update - sudo apt-get install -y cmake make libpcre3-dev libboost-container-dev libxml2-utils - sudo apt-get install -y libcups2-dev # required for Qt6PrintSupport in CMake since Qt 6.7.3 - - - name: Install clang - run: | - 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 - - - name: Install Qt ${{ env.QT_VERSION }} - uses: jurplel/install-qt-action@v4 - with: - version: ${{ env.QT_VERSION }} - modules: 'qtcharts' - setup-python: 'false' - cache: true - - - name: Install missing Python packages - run: | - python3 -m pip install pip --upgrade - python3 -m pip install pytest - python3 -m pip install pytest-timeout - python3 -m pip install pytest-xdist - python3 -m pip install psutil - - # TODO: disable all warnings - - name: CMake - run: | - cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DUSE_QT6=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_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - env: - CC: clang-21 - CXX: clang++-21 - - - name: Build cppcheck - run: | - cmake --build cmake.output --target cppcheck -- -j $(nproc) - - - name: Build test - run: | - cmake --build cmake.output --target testrunner -- -j $(nproc) - - - name: Build GUI tests - run: | - cmake --build cmake.output --target gui-tests -- -j $(nproc) - - - name: Run tests - run: ./cmake.output/bin/testrunner - - - name: Run cfg tests - run: | - cmake --build cmake.output --target checkcfg -- -j $(nproc) - - - name: Run CTest - run: | - ctest --test-dir cmake.output --output-on-failure -j$(nproc) - - - name: Run test/cli - run: | - pwd=$(pwd) - TEST_CPPCHECK_EXE_LOOKUP_PATH="$pwd/cmake.output" python3 -m pytest -Werror --strict-markers -vv -n auto test/cli - - - name: Run test/cli (-j2) - run: | - pwd=$(pwd) - TEST_CPPCHECK_EXE_LOOKUP_PATH="$pwd/cmake.output" python3 -m pytest -Werror --strict-markers -vv -n auto test/cli - env: - TEST_CPPCHECK_INJECT_J: 2 - - - name: Run test/cli (--clang) - if: false - run: | - pwd=$(pwd) - TEST_CPPCHECK_EXE_LOOKUP_PATH="$pwd/cmake.output" python3 -m pytest -Werror --strict-markers -vv -n auto test/cli - env: - TEST_CPPCHECK_INJECT_CLANG: clang - - - name: Run test/cli (--cppcheck-build-dir) - run: | - pwd=$(pwd) - TEST_CPPCHECK_EXE_LOOKUP_PATH="$pwd/cmake.output" python3 -m pytest -Werror --strict-markers -vv -n auto test/cli - env: - TEST_CPPCHECK_INJECT_BUILDDIR: injected - - - name: Generate dependencies - if: false - run: | - # make sure auto-generated GUI files exist - make -C cmake.output autogen - make -C cmake.output gui-build-deps triage-build-ui-deps - - # TODO: this is currently way too slow (~60 minutes) to enable it - # TODO: only fail the step on sanitizer issues - since we use processes it will only fail the underlying process which will result in an cppcheckError - - name: Self check - if: false - run: | - selfcheck_options="-q -j$(nproc) --std=c++11 --template=selfcheck --showtime=file-total -D__GNUC__ --error-exitcode=1 --inline-suppr --suppressions-list=.selfcheck_suppressions --library=gnu --inconclusive --enable=style,performance,portability,warning,missingInclude --exception-handling --debug-warnings --check-level=exhaustive" - cppcheck_options="-D__CPPCHECK__ -DCHECK_INTERNAL -DHAVE_RULES --library=cppcheck-lib -Ilib -Iexternals/simplecpp/ -Iexternals/tinyxml2" - ec=0 - ./cmake.output/bin/cppcheck $selfcheck_options externals || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json frontend || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json -Ifrontend cli || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json --enable=internal lib || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt --addon=naming.json -Icmake.output/gui -Ifrontend -Igui gui/*.cpp cmake.output/gui/*.cpp || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -Icli -Ifrontend test/*.cpp || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -Icli tools/dmake/*.cpp || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt -Icmake.output/tools/triage -Igui tools/triage/*.cpp cmake.output/tools/triage/*.cpp || ec=1 - exit $ec diff --git a/.github/workflows/buildman.yml b/.github/workflows/buildman.yml deleted file mode 100644 index b0b399dd851..00000000000 --- a/.github/workflows/buildman.yml +++ /dev/null @@ -1,65 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: Build manual - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -jobs: - convert_via_pandoc: - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - run: | - mkdir output - - - uses: docker://pandoc/latex:3.6.3 - with: - args: --output=output/manual.html man/manual.md - - - uses: docker://pandoc/latex:3.6.3 - with: - args: --output=output/manual.pdf man/manual.md - - - uses: docker://pandoc/latex:3.6.3 - with: - args: --output=output/manual-premium.pdf man/manual-premium.md - - - uses: actions/upload-artifact@v4 - with: - name: output - path: output - - manpage: - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Install missing software on ubuntu - run: | - sudo apt-get update - sudo apt-get install -y xsltproc docbook-xsl - - - name: build manpage - run: | - make man - - - uses: actions/upload-artifact@v4 - with: - name: cppcheck.1 - path: cppcheck.1 diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml deleted file mode 100644 index 7b462c688f0..00000000000 --- a/.github/workflows/cifuzz.yml +++ /dev/null @@ -1,34 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: CIFuzz - -on: [pull_request] - -permissions: - contents: read - -jobs: - Fuzzing: - runs-on: ubuntu-latest - if: ${{ github.repository_owner == 'danmar' }} - steps: - - name: Build Fuzzers - id: build - uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master - with: - oss-fuzz-project-name: 'cppcheck' - dry-run: false - language: c++ - - name: Run Fuzzers - uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master - with: - oss-fuzz-project-name: 'cppcheck' - fuzz-seconds: 300 - dry-run: false - language: c++ - - name: Upload Crash - uses: actions/upload-artifact@v4 - if: failure() && steps.build.outcome == 'success' - with: - name: artifacts - path: ./out/artifacts diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 185ebe139c6..00000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,52 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: "CodeQL" - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-22.04 - permissions: - security-events: write - - strategy: - fail-fast: false - matrix: - # Override automatic language detection by changing the below list - # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] - language: ['cpp', 'python'] - # Learn more... - # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - persist-credentials: false - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - - - name: Build cppcheck - if: matrix.language == 'cpp' - run: | - make -j$(nproc) HAVE_RULES=yes cppcheck - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml deleted file mode 100644 index 3c0c8e1d1df..00000000000 --- a/.github/workflows/coverage.yml +++ /dev/null @@ -1,71 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: Coverage - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -jobs: - build: - - runs-on: ubuntu-22.04 - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ runner.os }} - - - name: Install missing software on ubuntu - run: | - sudo apt-get update - sudo apt-get install libxml2-utils lcov - - - name: Install missing Python packages on ubuntu - run: | - python -m pip install pip --upgrade - python -m pip install lcov_cobertura - - - name: Compile instrumented - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - make -j$(nproc) all CXXFLAGS="-g -fprofile-arcs -ftest-coverage" HAVE_RULES=yes - - - name: Run instrumented tests - run: | - ./testrunner - test/cfg/runtests.sh - - - name: Generate coverage report - run: | - gcov lib/*.cpp -o lib/ - lcov --directory ./ --capture --output-file lcov_tmp.info -b ./ - lcov --extract lcov_tmp.info "$(pwd)/*" --output-file lcov.info - genhtml lcov.info -o coverage_report --frame --legend --demangle-cpp - - - uses: actions/upload-artifact@v4 - with: - name: Coverage results - path: coverage_report - - - uses: codecov/codecov-action@v4 - with: - token: ${{ secrets.CODECOV_TOKEN }} - # file: ./coverage.xml # optional - flags: unittests # optional - name: ${{ github.repository }} # optional - fail_ci_if_error: true # optional (default = false): diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml deleted file mode 100644 index 3c07b61d7c7..00000000000 --- a/.github/workflows/coverity.yml +++ /dev/null @@ -1,41 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: Coverity - -on: - schedule: - - cron: "0 0 * * *" - -permissions: - contents: read - -jobs: - scan: - runs-on: ubuntu-latest - if: ${{ github.repository_owner == 'danmar' }} - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - name: Install missing software on ubuntu - run: | - sudo apt-get update - sudo apt-get install qtbase5-dev qttools5-dev libqt5charts5-dev libboost-container-dev - - name: Download Coverity build tool - run: | - wget -c -N https://scan.coverity.com/download/linux64 --post-data "token=${{ secrets.COVERITY_SCAN_TOKEN }}&project=cppcheck" -O coverity_tool.tar.gz - mkdir coverity_tool - tar xzf coverity_tool.tar.gz --strip 1 -C coverity_tool - - name: Build with Coverity build tool - run: | - export PATH=`pwd`/coverity_tool/bin:$PATH - cov-build --dir cov-int make CPPCHK_GLIBCXX_DEBUG= - - name: Submit build result to Coverity Scan - run: | - tar czvf cov.tar.gz cov-int - curl --form token=${{ secrets.COVERITY_SCAN_TOKEN }} \ - --form email=daniel.marjamaki@gmail.com \ - --form file=@cov.tar.gz \ - --form version="Commit $GITHUB_SHA" \ - --form description="Development" \ - https://scan.coverity.com/builds?project=cppcheck diff --git a/.github/workflows/cppcheck-premium.yml b/.github/workflows/cppcheck-premium.yml deleted file mode 100644 index 87aa920193e..00000000000 --- a/.github/workflows/cppcheck-premium.yml +++ /dev/null @@ -1,82 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: cppcheck-premium - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - workflow_dispatch: - inputs: - premium_version: - description: 'Cppcheck Premium version' - -permissions: - contents: read - security-events: write - -jobs: - - build: - runs-on: ubuntu-24.04 # run on the latest image only - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Download cppcheckpremium release - if: false - run: | - premium_version=${{ inputs.premium_version }} - if [ -z $premium_version ]; then - premium_version=24.11.0 - #wget https://files.cppchecksolutions.com/devdrop/cppcheckpremium-$premium_version-amd64.tar.gz -O cppcheckpremium.tar.gz - wget https://files.cppchecksolutions.com/$premium_version/ubuntu-24.04/cppcheckpremium-$premium_version-amd64.tar.gz -O cppcheckpremium.tar.gz - else - wget https://files.cppchecksolutions.com/$premium_version/ubuntu-24.04/cppcheckpremium-$premium_version-amd64.tar.gz -O cppcheckpremium.tar.gz - fi - tar xzf cppcheckpremium.tar.gz - mv cppcheckpremium-$premium_version cppcheckpremium - - - name: Download cppcheckpremium devdrop - run: | - wget https://files.cppchecksolutions.com/devdrop/cppcheckpremium-devdrop-20250713-amd64.tar.gz -O cppcheckpremium.tar.gz - tar xzvf cppcheckpremium.tar.gz - mv cppcheckpremium-devdrop-20250713 cppcheckpremium - # Overwrite cppcheck binary - make -j$(nproc) CXXFLAGS=-O2 MATCHCOMPILER=yes - cp cppcheck cppcheckpremium/ - - - name: Generate a license file - run: | - echo cppcheck > cppcheck.lic - echo 251231 >> cppcheck.lic - echo 80000 >> cppcheck.lic - echo 4f8dc8e7c8bb288f >> cppcheck.lic - echo path:lib >> cppcheck.lic - - - name: Check - run: | - cppcheckpremium/premiumaddon --check-loc-license cppcheck.lic > cppcheck-premium-loc - cppcheckpremium/cppcheck --premium=safety-off -j$(nproc) -D__GNUC__ -D__CPPCHECK__ --suppressions-list=cppcheckpremium-suppressions --platform=unix64 --enable=style --premium=misra-c++-2023 --premium=cert-c++-2016 --inline-suppr lib --error-exitcode=0 --output-format=sarif 2> results.sarif - - - name: Cat results - run: | - #sed -i 's|"security-severity":.*||' results.sarif - cat results.sarif - - - uses: actions/upload-artifact@v4 - with: - name: results - path: results.sarif - - - name: Upload report - uses: github/codeql-action/upload-sarif@v3 - with: - sarif_file: results.sarif - category: cppcheckpremium diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml deleted file mode 100644 index 8ad9408a376..00000000000 --- a/.github/workflows/format.yml +++ /dev/null @@ -1,55 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: format - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -jobs: - build: - - runs-on: ubuntu-22.04 - - env: - UNCRUSTIFY_VERSION: 0.80.1 - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Cache uncrustify - uses: actions/cache@v4 - id: cache-uncrustify - with: - path: | - ~/uncrustify - key: ${{ runner.os }}-uncrustify-${{ env.UNCRUSTIFY_VERSION }} - - - name: build uncrustify - if: steps.cache-uncrustify.outputs.cache-hit != 'true' - run: | - set -x - wget https://github.com/uncrustify/uncrustify/archive/refs/tags/uncrustify-${{ env.UNCRUSTIFY_VERSION }}.tar.gz - tar xzvf uncrustify-${{ env.UNCRUSTIFY_VERSION }}.tar.gz - cd uncrustify-uncrustify-${{ env.UNCRUSTIFY_VERSION }} - cmake -S . -B build -DCMAKE_BUILD_TYPE=Release - cmake --build build -- -j$(nproc) -s - mkdir ~/uncrustify - cp build/uncrustify ~/uncrustify/ - - - name: Uncrustify check - run: | - ~/uncrustify/uncrustify -c .uncrustify.cfg -l CPP --no-backup --replace */*.cpp */*.h - git diff - git diff | diff - /dev/null &> /dev/null diff --git a/.github/workflows/iwyu.yml b/.github/workflows/iwyu.yml deleted file mode 100644 index 6e5332c089d..00000000000 --- a/.github/workflows/iwyu.yml +++ /dev/null @@ -1,270 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: include-what-you-use - -on: - schedule: - - cron: '0 0 * * 0' - workflow_dispatch: - -permissions: - contents: read - -jobs: - iwyu: - - strategy: - matrix: - # "opensuse/tumbleweed:latest" / "fedora:latest" / "debian:unstable" / "archlinux:latest" - include: - - os: ubuntu-22.04 - image: "fedora:latest" - stdlib: libstdc++ - clang_inc: '-isystem/usr/lib/clang/20/include' - # TODO: disable because it currently fails with "error: tried including but didn't find libc++'s header." - #- os: ubuntu-22.04 - # image: "fedora:latest" - # stdlib: libc++ - # clang_inc: '-isystem/usr/lib/clang/20/include' - - os: macos-13 - image: "" - stdlib: libc++ # no libstdc++ on macOS - mapping_file_opt: '-Xiwyu --mapping_file=$(realpath ./macos.imp)' - fail-fast: false - - runs-on: ${{ matrix.os }} - if: ${{ github.repository_owner == 'danmar' }} - - container: - image: ${{ matrix.image }} - - env: - QT_VERSION: 6.9.1 - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Install missing software on debian/ubuntu - if: contains(matrix.image, 'debian') - run: | - apt-get update - apt-get install -y cmake clang make libpcre3-dev - apt-get install -y libgl-dev # fixes missing dependency for Qt in CMake - apt-get install -y iwyu - - - name: Install missing software on archlinux - if: contains(matrix.image, 'archlinux') - run: | - set -x - pacman -Sy - pacman -S cmake make clang pcre --noconfirm - pacman -S libglvnd --noconfirm # fixes missing dependency for Qt in CMake - pacman-key --init - pacman-key --recv-key 3056513887B78AEB --keyserver keyserver.ubuntu.com - pacman-key --lsign-key 3056513887B78AEB - pacman -U 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-keyring.pkg.tar.zst' 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-mirrorlist.pkg.tar.zst' --noconfirm - echo "[chaotic-aur]" >> /etc/pacman.conf - echo "Include = /etc/pacman.d/chaotic-mirrorlist" >> /etc/pacman.conf - pacman -Sy - pacman -S include-what-you-use --noconfirm - ln -s iwyu-tool /usr/sbin/iwyu_tool - - - name: Install missing software on Fedora - if: contains(matrix.image, 'fedora') - run: | - dnf install -y cmake clang pcre-devel - dnf install -y libglvnd-devel # fixes missing dependency for Qt in CMake - dnf install -y p7zip-plugins # required as fallback for py7zr in Qt installation - dnf install -y python3-pip # fixes missing pip module in jurplel/install-qt-action - dnf install -y python3-devel # fixes building of wheels for jurplel/install-qt-action - dnf install -y cairo-devel gtk3-devel libcurl-devel lua-devel openssl-devel python3-devel sqlite-devel boost-devel cppunit-devel libsigc++20-devel # for strict cfg checks - dnf install -y iwyu - ln -s iwyu_tool.py /usr/bin/iwyu_tool - - - name: Install missing software on Fedora (libc++) - if: contains(matrix.image, 'fedora') && matrix.stdlib == 'libc++' - run: | - dnf install -y libcxx-devel - - - name: Install missing software on OpenSUSE - if: contains(matrix.image, 'opensuse') - run: | - zypper install -y cmake clang pcre-devel - zypper install -y include-what-you-use-tools - ln -s iwyu_tool.py /usr/bin/iwyu_tool - - # coreutils contains "nproc" - - name: Install missing software on macOS - if: contains(matrix.os, 'macos') - run: | - brew install include-what-you-use pcre coreutils - ln -s iwyu_tool.py /usr/local/bin/iwyu_tool - - # Fails on OpenSUSE: - # Warning: Failed to restore: Tar failed with error: Unable to locate executable file: tar. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable. - # Also the shell is broken afterwards: - # OCI runtime exec failed: exec failed: unable to start container process: exec: "sh": executable file not found in $PATH: unknown - - name: Install Qt ${{ env.QT_VERSION }} - uses: jurplel/install-qt-action@v4 - with: - version: ${{ env.QT_VERSION }} - modules: 'qtcharts' - setup-python: 'false' - install-deps: false - cache: true - - - name: Generate macOS mappings - if: contains(matrix.os, 'macos') - run: | - set -x - - wget https://raw.githubusercontent.com/include-what-you-use/include-what-you-use/master/mapgen/iwyu-mapgen-apple-libc.py - python3 iwyu-mapgen-apple-libc.py $(xcrun --show-sdk-path)/usr/include > macos.imp - - - name: Prepare CMake - run: | - # TODO: why does it build dmake in the next step? - 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 -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCPPCHK_GLIBCXX_DEBUG=Off -DUSE_MATCHCOMPILER=Off -DEXTERNALS_AS_SYSTEM=On -DUSE_LIBCXX=${{ matrix.stdlib == 'libc++' }} - env: - CC: clang - CXX: clang++ - - # Fails on Debian: - # /__w/cppcheck/Qt/6.7.0/gcc_64/libexec/rcc: error while loading shared libraries: libglib-2.0.so.0: cannot open shared object file: No such file or directory - - name: Prepare CMake dependencies - run: | - # make sure the auto-generated GUI sources exist - make -C cmake.output autogen - # make sure the precompiled headers exist - #make -C cmake.output/cli cmake_pch.hxx.pch - #make -C cmake.output/gui cmake_pch.hxx.pch - #make -C cmake.output/lib cmake_pch.hxx.pch - #make -C cmake.output/test cmake_pch.hxx.pch - # make sure the auto-generated GUI dependencies exist - make -C cmake.output gui-build-deps - make -C cmake.output triage-build-ui-deps - - - name: iwyu_tool - run: | - # TODO: remove -stdlib= - it should have been taken from the compilation database - iwyu_tool -p cmake.output -j $(nproc) -- -w -Xiwyu --max_line_length=1024 -Xiwyu --comment_style=long -Xiwyu --quoted_includes_first -Xiwyu --update_comments -stdlib=${{ matrix.stdlib }} ${{ matrix.mapping_file_opt }} ${{ matrix.clang_inc }} > iwyu.log - - # TODO: run with all configurations - - name: test/cfg - if: matrix.stdlib == 'libstdc++' - run: | - # TODO: redirect to log - ./test/cfg/runtests.sh - env: - IWYU: include-what-you-use - IWYU_CLANG_INC: ${{ matrix.clang_inc }} - - - uses: actions/upload-artifact@v4 - if: success() || failure() - with: - name: Compilation Database (include-what-you-use - ${{ matrix.os }} ${{ matrix.stdlib }}) - path: ./cmake.output/compile_commands.json - - - uses: actions/upload-artifact@v4 - if: ${{ contains(matrix.os, 'macos') && (success() || failure()) }} - with: - name: macOS Mappings - path: | - ./iwyu-mapgen-apple-libc.py - ./macos.imp - - - uses: actions/upload-artifact@v4 - if: success() || failure() - with: - name: Logs (include-what-you-use - ${{ matrix.os }} ${{ matrix.stdlib }}) - path: ./*.log - - clang-include-cleaner: - - strategy: - matrix: - stdlib: [libstdc++, libc++] - include: - - stdlib: libstdc++ - use_libcxx: Off - - stdlib: libc++ - use_libcxx: On - fail-fast: false - - runs-on: ubuntu-22.04 - if: ${{ github.repository_owner == 'danmar' }} - - env: - QT_VERSION: 6.9.1 - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Install missing software - run: | - sudo apt-get update - sudo apt-get install -y cmake make libpcre3-dev - sudo apt-get install -y libgl-dev # missing dependency for using Qt in CMake - - - name: Install clang - run: | - 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 - - - name: Install libc++ - if: matrix.stdlib == 'libc++' - run: | - sudo apt-get install -y libc++-21-dev - - - name: Install Qt ${{ env.QT_VERSION }} - uses: jurplel/install-qt-action@v4 - with: - version: ${{ env.QT_VERSION }} - modules: 'qtcharts' - setup-python: 'false' - install-deps: false - cache: true - - - name: Prepare CMake - run: | - # TODO: why does it build dmake in the next step? - 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 -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 - - - name: Prepare CMake dependencies - run: | - # make sure the auto-generated GUI sources exist - make -C cmake.output autogen - # make sure the precompiled headers exist - #make -C cmake.output/cli cmake_pch.hxx.pch - #make -C cmake.output/gui cmake_pch.hxx.pch - #make -C cmake.output/lib cmake_pch.hxx.pch - #make -C cmake.output/test cmake_pch.hxx.pch - # make sure the auto-generated GUI dependencies exist - make -C cmake.output gui-build-deps - - - 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 - - - uses: actions/upload-artifact@v4 - if: success() || failure() - with: - name: Compilation Database (clang-include-cleaner - ${{ matrix.stdlib }}) - path: ./cmake.output/compile_commands.json - - - uses: actions/upload-artifact@v4 - if: success() || failure() - with: - name: Logs (clang-include-cleaner - ${{ matrix.stdlib }}) - path: ./*.log diff --git a/.github/workflows/release-windows.yml b/.github/workflows/release-windows.yml deleted file mode 100644 index afc6643e268..00000000000 --- a/.github/workflows/release-windows.yml +++ /dev/null @@ -1,197 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: release-windows - -on: - push: - tags: - - '2.*' - schedule: - - cron: '0 0 * * *' - workflow_dispatch: - -permissions: - contents: read - -defaults: - run: - shell: cmd - -jobs: - - build: - - runs-on: windows-2025 - if: ${{ github.repository_owner == 'danmar' }} - - env: - # see https://www.pcre.org/original/changelog.txt - PCRE_VERSION: 8.45 - QT_VERSION: 6.9.1 - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Set up Visual Studio environment - uses: ilammy/msvc-dev-cmd@v1 - - - name: Download PCRE - run: | - curl -fsSL https://github.com/pfultz2/pcre/archive/refs/tags/%PCRE_VERSION%.zip -o pcre-%PCRE_VERSION%.zip || exit /b !errorlevel! - - - name: Install PCRE - run: | - @echo on - 7z x pcre-%PCRE_VERSION%.zip || exit /b !errorlevel! - cd pcre-%PCRE_VERSION% || exit /b !errorlevel! - git apply --ignore-space-change ..\externals\pcre.patch || exit /b !errorlevel! - cmake . -G "Visual Studio 17 2022" -A x64 -DPCRE_BUILD_PCRECPP=OFF -DPCRE_BUILD_PCREGREP=OFF -DPCRE_BUILD_TESTS=OFF -DCMAKE_POLICY_VERSION_MINIMUM=3.5 || exit /b !errorlevel! - msbuild -m PCRE.sln -p:Configuration=Release -p:Platform=x64 || exit /b !errorlevel! - copy pcre.h ..\externals || exit /b !errorlevel! - copy Release\pcre.lib ..\externals\pcre64.lib || exit /b !errorlevel! - - # available modules: https://github.com/miurahr/aqtinstall/blob/master/docs/getting_started.rst#installing-modules - # available tools: https://github.com/miurahr/aqtinstall/blob/master/docs/getting_started.rst#installing-tools - - name: Install Qt ${{ env.QT_VERSION }} - uses: jurplel/install-qt-action@v4 - with: - version: ${{ env.QT_VERSION }} - modules: 'qtcharts' - setup-python: 'false' - tools: 'tools_opensslv3_x64' - aqtversion: '==3.1.*' # TODO: remove when aqtinstall 3.2.2 is available - - # TODO: build with multiple threads - - name: Build x64 release GUI - run: | - :: TODO: enable rules? - :: specify Release build so matchcompiler is used - cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_GUI=On -DUSE_QT6=On -DWITH_QCHART=On -DBUILD_ONLINE_HELP=On || exit /b !errorlevel! - cmake --build build --target cppcheck-gui --config Release || exit /b !errorlevel! - - # TODO: package PDBs - - name: Deploy app - run: | - windeployqt build\bin\Release || exit /b !errorlevel! - del build\bin\Release\cppcheck-gui.ilk || exit /b !errorlevel! - del build\bin\Release\cppcheck-gui.pdb || exit /b !errorlevel! - - - uses: actions/upload-artifact@v4 - with: - name: deploy - path: build\bin\Release - - - name: Matchcompiler - run: python tools\matchcompiler.py --write-dir lib || exit /b !errorlevel! - - # TODO: build with multiple threads - # TODO: build with boost enabled - - name: Build CLI x64 release configuration using MSBuild - run: msbuild -m cppcheck.sln -t:cli -p:Configuration=Release-PCRE -p:Platform=x64 || exit /b !errorlevel! - - - uses: actions/upload-artifact@v4 - with: - name: bin - path: bin - - - name: Install missing Python packages - run: | - pip install -U pyinstaller || exit /b !errorlevel! - - # TODO: include in installer? - - name: Compile misra.py executable - run: | - cd addons || exit /b !errorlevel! - pyinstaller --hidden-import xml --hidden-import xml.etree --hidden-import xml.etree.ElementTree misra.py || exit /b !errorlevel! - del *.spec || exit /b !errorlevel! - - # TODO: include in installer? - - name: Compile cppcheck-htmlreport executable - run: | - cd htmlreport || exit /b !errorlevel! - pyinstaller cppcheck-htmlreport || exit /b !errorlevel! - del *.spec || exit /b !errorlevel! - - # TODO: test the compiled Python files - - - name: Collect files - run: | - @echo on - move build\bin\Release win_installer\files || exit /b !errorlevel! - copy AUTHORS win_installer\files\authors.txt || exit /b !errorlevel! - copy win_installer\GPLv3.txt win_installer\files\ || exit /b !errorlevel! - copy externals\picojson\LICENSE win_installer\files\picojson-license.txt || exit /b !errorlevel! - copy externals\simplecpp\LICENSE win_installer\files\simplecpp-license.txt || exit /b !errorlevel! - copy externals\tinyxml2\LICENSE win_installer\files\tinyxml2-license.txt || exit /b !errorlevel! - copy addons\dist\misra\*.* win_installer\files\addons || exit /b !errorlevel! - copy bin\cppcheck.exe win_installer\files || exit /b !errorlevel! - copy bin\cppcheck-core.dll win_installer\files || exit /b !errorlevel! - :: mkdir win_installer\files\help || exit /b !errorlevel! - xcopy /s gui\help win_installer\files\help || exit /b !errorlevel! - copy gui\help\online-help.qhc win_installer\files\ || exit /b !errorlevel! - copy gui\help\online-help.qch win_installer\files\ || exit /b !errorlevel! - del win_installer\files\cfg\*.rng || exit /b !errorlevel! - del win_installer\files\platforms\*.rng || exit /b !errorlevel! - del win_installer\files\translations\*.qm || exit /b !errorlevel! - move build\gui\*.qm win_installer\files\translations || exit /b !errorlevel! - copy htmlreport\dist\cppcheck-htmlreport\*.* win_installer\files || exit /b !errorlevel! - :: copy libcrypto-3-x64.dll and libssl-3-x64.dll - copy %RUNNER_WORKSPACE%\Qt\Tools\OpenSSLv3\Win_x64\bin\lib*.dll win_installer\files || exit /b !errorlevel! - - - uses: actions/upload-artifact@v4 - with: - name: collect - path: win_installer\files - - - name: Build Installer - run: | - cd win_installer || exit /b !errorlevel! - :: Read ProductVersion - for /f "tokens=4 delims= " %%a in ('find "ProductVersion" productInfo.wxi') do set PRODUCTVER=%%a - :: Remove double quotes - set PRODUCTVER=%PRODUCTVER:"=% - @echo ProductVersion="%PRODUCTVER%" || exit /b !errorlevel! - msbuild -m cppcheck.wixproj -p:Platform=x64,ProductVersion=%PRODUCTVER%.${{ github.run_number }} || exit /b !errorlevel! - - - uses: actions/upload-artifact@v4 - with: - name: installer - path: win_installer/Build/ - - - name: Clean up deploy - run: | - @echo on - :: del win_installer\files\addons\*.dll || exit /b !errorlevel! - del win_installer\files\addons\*.doxyfile || exit /b !errorlevel! - del win_installer\files\addons\*.md || exit /b !errorlevel! - :: del win_installer\files\addons\*.pyd || exit /b !errorlevel! - :: del win_installer\files\addons\base_library.zip || exit /b !errorlevel! - rmdir /s /q win_installer\files\addons\test || exit /b !errorlevel! - rmdir /s /q win_installer\files\addons\doc || exit /b !errorlevel! - :: rmdir /s /q win_installer\files\bearer || exit /b !errorlevel! - rmdir /s /q win_installer\files\generic || exit /b !errorlevel! - rmdir /s /q win_installer\files\help || exit /b !errorlevel! - rmdir /s /q win_installer\files\iconengines || exit /b !errorlevel! - rmdir /s /q win_installer\files\imageformats || exit /b !errorlevel! - rmdir /s /q win_installer\files\networkinformation || exit /b !errorlevel! - :: rmdir /s /q win_installer\files\printsupport || exit /b !errorlevel! - rmdir /s /q win_installer\files\sqldrivers || exit /b !errorlevel! - rmdir /s /q win_installer\files\tls || exit /b !errorlevel! - ren win_installer\files\translations lang || exit /b !errorlevel! - del win_installer\files\d3dcompiler_47.dll || exit /b !errorlevel! - del win_installer\files\dxcompiler.dll || exit /b !errorlevel! - del win_installer\files\dxil.dll || exit /b !errorlevel! - del win_installer\files\dmake.exe || exit /b !errorlevel! - del win_installer\files\dmake.pdb || exit /b !errorlevel! - :: del win_installer\files\libEGL.dll || exit /b !errorlevel! - :: del win_installer\files\libGLESv2.dll || exit /b !errorlevel! - del win_installer\files\opengl32sw.dll || exit /b !errorlevel! - del win_installer\files\Qt6Svg.dll || exit /b !errorlevel! - del win_installer\files\vc_redist.x64.exe || exit /b !errorlevel! - - - uses: actions/upload-artifact@v4 - with: - name: portable - path: win_installer\files diff --git a/.github/workflows/scriptcheck.yml b/.github/workflows/scriptcheck.yml deleted file mode 100644 index 3394604d155..00000000000 --- a/.github/workflows/scriptcheck.yml +++ /dev/null @@ -1,222 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: scriptcheck - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -jobs: - build: - - runs-on: ubuntu-22.04 - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ runner.os }} - - - name: Cache Cppcheck - uses: actions/cache@v4 - with: - path: cppcheck - key: ${{ runner.os }}-scriptcheck-cppcheck-${{ github.sha }} - - - name: build cppcheck - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - make -j$(nproc) -s CXXFLAGS="-w" - strip -s ./cppcheck - - scriptcheck: - - needs: build - runs-on: ubuntu-22.04 - strategy: - matrix: - python-version: [3.7, 3.8, 3.9, '3.10', '3.11', '3.12', '3.13'] - include: - - python-version: '3.13' - python-latest: true - - fail-fast: false - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - # TODO: bailout on error - - name: Restore Cppcheck - uses: actions/cache@v4 - with: - path: cppcheck - key: ${{ runner.os }}-scriptcheck-cppcheck-${{ github.sha }} - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - check-latest: true - - - name: Install missing software on ubuntu - run: | - sudo apt-get update - sudo apt-get install tidy libxml2-utils - - - name: Install missing software on ubuntu (Python 3) - run: | - # shellcheck cannot be installed via pip - # ERROR: Could not find a version that satisfies the requirement shellcheck (from versions: none) - # ERROR: No matching distribution found for shellcheck - sudo apt-get install shellcheck - python -m pip install pip --upgrade - python -m pip install natsort - python -m pip install pexpect - python -m pip install 'pylint<=3.3.0' - python -m pip install unittest2 - python -m pip install pytest - python -m pip install pytest-xdist - python -m pip install pygments - python -m pip install requests - python -m pip install psutil - python -m pip install setuptools - - - name: run Shellcheck - if: matrix.python-latest - run: | - find . -name "*.sh" | xargs shellcheck --exclude SC2002,SC2013,SC2034,SC2035,SC2043,SC2046,SC2086,SC2089,SC2090,SC2129,SC2211,SC2231 - - - name: run pylint - if: matrix.python-latest - run: | - shopt -s globstar - pylint --jobs $(nproc) --py-version 3.7 addons/**/*.py htmlreport/cppcheck-htmlreport htmlreport/**/*.py test/**/*.py tools/**/*.py - - - name: check .json files - if: matrix.python-latest - run: | - find . -name '*.json' | xargs -n 1 python -m json.tool > /dev/null - - - name: Validate - if: matrix.python-latest - run: | - make -j$(nproc) validateCFG validatePlatforms validateRules - - - name: check python syntax - run: | - shopt -s globstar - python -m py_compile addons/**/*.py - python -m py_compile htmlreport/cppcheck-htmlreport - python -m py_compile htmlreport/**/*.py - python -m py_compile test/**/*.py - python -m py_compile tools/**/*.py - - - name: compile addons - run: | - python -m compileall ./addons - - - name: test matchcompiler - run: | - python test/tools/test_matchcompiler.py - env: - PYTHONPATH: ./tools - - # TODO: run with "-n auto" when misra_test.py can be run in parallel - # we cannot specify -Werror since xml/etree/ElementTree.py in Python 3.9/3.10 contains an unclosed file - - name: test addons - if: matrix.python-version == '3.9' || matrix.python-version == '3.10' - run: | - python -m pytest --strict-markers -vv -n 1 addons/test - env: - PYTHONPATH: ./addons - - # TODO: run with "-n auto" when misra_test.py can be run in parallel - - name: test addons - if: matrix.python-version != '3.9' && matrix.python-version != '3.10' - run: | - python -m pytest -Werror --strict-markers -vv -n 1 addons/test - env: - PYTHONPATH: ./addons - - - name: test htmlreport (standalone) - run: | - test/tools/htmlreport/test_htmlreport.py - test/tools/htmlreport/check.sh - - - name: test htmlreport (pip) - run: | - python -m venv venv - source venv/bin/activate - python -m pip install -U pip - pip install ./htmlreport/ - which cppcheck-htmlreport - PIP_PACKAGE_TEST=1 test/tools/htmlreport/test_htmlreport.py - # TODO: does not test the pip binary - test/tools/htmlreport/check.sh - - - name: test reduce - run: | - python -m pytest -Werror --strict-markers -vv test/tools/reduce_test.py - env: - PYTHONPATH: ./tools - - - name: test donate_cpu_lib - run: | - python -m pytest -Werror --strict-markers -vv test/tools/donate_cpu_lib_test.py - env: - PYTHONPATH: ./tools - - - name: test donate_cpu_server - run: | - python -m pytest -Werror --strict-markers -vv test/tools/donate_cpu_server_test.py - # TODO: why is this file generated? also should be in a temporary folder if possible - rm -f test/tools/donate-cpu-server.log - env: - PYTHONPATH: ./tools - - - name: Show all ignored files - if: false # TODO: currently lists all the contents of ignored folders - we only need what actually matched - run: | - git ls-files --others --ignored --exclude-standard - - - name: Check for changed and unversioned files - run: | - # TODO: how to do this with a single command? - git status --ignored=no - git status --ignored=no | grep -q 'working tree clean' - - dmake: - strategy: - matrix: - os: [ubuntu-22.04, macos-13, macos-15, windows-2025] - fail-fast: false - - runs-on: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: run dmake - run: | - make -j3 CXXFLAGS="-w" run-dmake - - - name: check diff - run: | - git diff --exit-code diff --git a/.github/workflows/selfcheck.yml b/.github/workflows/selfcheck.yml deleted file mode 100644 index 69aab78db07..00000000000 --- a/.github/workflows/selfcheck.yml +++ /dev/null @@ -1,189 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: selfcheck - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -jobs: - build: - - runs-on: ubuntu-22.04 - - env: - QT_VERSION: 6.9.1 - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ runner.os }} - - - name: Install missing software - run: | - sudo apt-get update - sudo apt-get install clang-14 - sudo apt-get install libboost-container-dev - sudo apt-get install valgrind - sudo apt-get install -y libgl-dev # fixes missing dependency for Qt in CMake - - - name: Install Qt ${{ env.QT_VERSION }} - uses: jurplel/install-qt-action@v4 - with: - version: ${{ env.QT_VERSION }} - modules: 'qtcharts' - setup-python: 'false' - install-deps: false - cache: true - - # TODO: cache this - perform same build as for the other self check - - name: Self check (build) - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - # valgrind cannot handle DWARF 5 yet so force version 4 - # work around performance regression with -inline-deferral - make -j$(nproc) -s CXXFLAGS="-O2 -w -DHAVE_BOOST -gdwarf-4 -mllvm -inline-deferral" MATCHCOMPILER=yes - env: - CC: clang-14 - CXX: clang++-14 - - # unusedFunction - start - - name: 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 - - - name: Generate dependencies - run: | - # make sure auto-generated GUI files exist - make -C cmake.output autogen - # make sure the precompiled headers exist - make -C cmake.output lib/CMakeFiles/cppcheck-core.dir/cmake_pch.hxx.cxx - make -C cmake.output test/CMakeFiles/testrunner.dir/cmake_pch.hxx.cxx - # make sure the auto-generated GUI dependencies exist - make -C cmake.output gui-build-deps - - # TODO: find a way to report unmatched suppressions without need to add information checks - - name: Self check (unusedFunction) - if: false # TODO: fails with preprocessorErrorDirective - see #10667 - run: | - ./cppcheck -q --template=selfcheck --error-exitcode=1 --library=cppcheck-lib --library=qt -D__CPPCHECK__ -D__GNUC__ -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --enable=unusedFunction --exception-handling -rp=. --project=cmake.output/compile_commands.json --suppressions-list=.selfcheck_unused_suppressions --inline-suppr - env: - DISABLE_VALUEFLOW: 1 - UNUSEDFUNCTION_ONLY: 1 - # unusedFunction - end - - # the following steps are duplicated from above since setting up the build node in a parallel step takes longer than the actual steps - - # unusedFunction notest - start - - name: CMake (no test) - run: | - cmake -S . -B cmake.output.notest -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=Off -DBUILD_GUI=ON -DBUILD_TRIAGE=On -DWITH_QCHART=ON -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On - - - name: Generate dependencies (no test) - run: | - # make sure auto-generated GUI files exist - make -C cmake.output.notest autogen - # make sure the precompiled headers exist - make -C cmake.output.notest lib/CMakeFiles/cppcheck-core.dir/cmake_pch.hxx.cxx - # make sure the auto-generated GUI dependencies exist - make -C cmake.output.notest gui-build-deps - - # TODO: find a way to report unmatched suppressions without need to add information checks - - name: Self check (unusedFunction / no test) - run: | - ./cppcheck -q --template=selfcheck --error-exitcode=1 --library=cppcheck-lib --library=qt -D__CPPCHECK__ -D__GNUC__ -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --enable=unusedFunction --exception-handling -rp=. --project=cmake.output.notest/compile_commands.json --suppressions-list=.selfcheck_unused_suppressions --inline-suppr - env: - DISABLE_VALUEFLOW: 1 - UNUSEDFUNCTION_ONLY: 1 - # unusedFunction notest - end - - # unusedFunction notest nogui - start - - name: CMake (no test / no gui) - run: | - cmake -S . -B cmake.output.notest_nogui -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=Off -DENABLE_CHECK_INTERNAL=On - - - name: Generate dependencies (no test / no gui) - run: | - # make sure the precompiled headers exist - make -C cmake.output.notest_nogui lib/CMakeFiles/cppcheck-core.dir/cmake_pch.hxx.cxx - - # TODO: find a way to report unmatched suppressions without need to add information checks - - name: Self check (unusedFunction / no test / no gui) - run: | - ./cppcheck -q --template=selfcheck --error-exitcode=1 --library=cppcheck-lib -D__CPPCHECK__ -D__GNUC__ --enable=unusedFunction --exception-handling -rp=. --project=cmake.output.notest_nogui/compile_commands.json --suppressions-list=.selfcheck_unused_suppressions --inline-suppr - env: - DISABLE_VALUEFLOW: 1 - UNUSEDFUNCTION_ONLY: 1 - # unusedFunction notest nogui - end - - # unusedFunction notest nocli - start - - name: CMake (no test / no cli) - run: | - cmake -S . -B cmake.output.notest_nocli -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=Off -DBUILD_CLI=Off -DBUILD_GUI=ON -DWITH_QCHART=ON -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On - - - name: Generate dependencies (no test / no cli) - run: | - # make sure auto-generated GUI files exist - make -C cmake.output.notest_nocli autogen - # make sure the precompiled headers exist - make -C cmake.output.notest_nocli lib/CMakeFiles/cppcheck-core.dir/cmake_pch.hxx.cxx - # make sure the auto-generated GUI dependencies exist - make -C cmake.output.notest_nocli gui-build-deps - - # TODO: find a way to report unmatched suppressions without need to add information checks - - name: Self check (unusedFunction / no test / no cli) - if: false # TODO: the findings are currently too intrusive - run: | - ./cppcheck -q --template=selfcheck --error-exitcode=1 --library=cppcheck-lib --library=qt -D__CPPCHECK__ -D__GNUC__ -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --enable=unusedFunction --exception-handling -rp=. --project=cmake.output.notest_nocli/compile_commands.json --suppressions-list=.selfcheck_unused_suppressions --inline-suppr - env: - DISABLE_VALUEFLOW: 1 - UNUSEDFUNCTION_ONLY: 1 - # unusedFunction notest nocli - end - - - name: Fetch corpus - run: | - wget https://github.com/danmar/cppcheck/archive/refs/tags/2.8.tar.gz - tar xvf 2.8.tar.gz - - - name: CMake (corpus / no test) - run: | - cmake -S cppcheck-2.8 -B cmake.output.corpus -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=Off -DBUILD_GUI=ON -DUSE_QT6=On -DWITH_QCHART=ON -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DCMAKE_POLICY_VERSION_MINIMUM=3.5 - - - name: Generate dependencies (corpus) - run: | - # make sure auto-generated GUI files exist - make -C cmake.output.corpus autogen - # make sure the precompiled headers exist - make -C cmake.output.corpus lib/CMakeFiles/lib_objs.dir/cmake_pch.hxx.cxx - # make sure the auto-generated GUI dependencies exist - make -C cmake.output.corpus gui-build-deps - - # TODO: find a way to report unmatched suppressions without need to add information checks - - name: Self check (unusedFunction / corpus / no test / callgrind) - run: | - # TODO: fix -rp so the suppressions actually work - valgrind --tool=callgrind ./cppcheck --template=selfcheck --error-exitcode=0 --library=cppcheck-lib --library=qt -D__GNUC__ -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --enable=unusedFunction --exception-handling -rp=. --project=cmake.output.corpus/compile_commands.json --suppressions-list=.selfcheck_unused_suppressions --inline-suppr 2>callgrind.log || (cat callgrind.log && false) - cat callgrind.log - callgrind_annotate --auto=no > callgrind.annotated.log - head -50 callgrind.annotated.log - env: - DISABLE_VALUEFLOW: 1 - - - uses: actions/upload-artifact@v4 - with: - name: Callgrind Output - path: ./callgrind.* diff --git a/.github/workflows/tsan.yml b/.github/workflows/tsan.yml deleted file mode 100644 index 8109e8c1ac5..00000000000 --- a/.github/workflows/tsan.yml +++ /dev/null @@ -1,158 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: thread sanitizer - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -jobs: - build: - - runs-on: ubuntu-22.04 - - env: - QT_VERSION: 6.9.1 - TSAN_OPTIONS: halt_on_error=1 - # TODO: figure out why there are cache misses with PCH enabled - CCACHE_SLOPPINESS: pch_defines,time_macros - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ github.job }}-${{ matrix.os }} - - - name: Set up Python 3.13 - uses: actions/setup-python@v5 - with: - python-version: '3.13' - check-latest: true - - - name: Install missing software on ubuntu - run: | - sudo apt-get update - sudo apt-get install -y cmake make libpcre3-dev libboost-container-dev libxml2-utils - sudo apt-get install -y libcups2-dev # required for Qt6PrintSupport in CMake since Qt 6.7.3 - - - name: Install clang - run: | - 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 - - - name: Install Qt ${{ env.QT_VERSION }} - uses: jurplel/install-qt-action@v4 - with: - version: ${{ env.QT_VERSION }} - modules: 'qtcharts' - setup-python: 'false' - cache: true - - - name: Install missing Python packages - run: | - python3 -m pip install pip --upgrade - python3 -m pip install pytest - python3 -m pip install pytest-timeout - python3 -m pip install pytest-xdist - python3 -m pip install psutil - - - name: CMake - run: | - cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DUSE_QT6=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_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - env: - CC: clang-21 - CXX: clang++-21 - - - name: Build cppcheck - run: | - cmake --build cmake.output --target cppcheck -- -j $(nproc) - - - name: Build test - run: | - cmake --build cmake.output --target testrunner -- -j $(nproc) - - - name: Build GUI tests - run: | - cmake --build cmake.output --target gui-tests -- -j $(nproc) - - - name: Run tests - run: ./cmake.output/bin/testrunner - - - name: Run cfg tests - run: | - cmake --build cmake.output --target checkcfg -- -j $(nproc) - - - name: Run CTest - if: false # TODO: test-filelist fails with data race in pthread_cond_destroy - run: | - ctest --test-dir cmake.output --output-on-failure -j$(nproc) - - - name: Run test/cli - run: | - pwd=$(pwd) - TEST_CPPCHECK_EXE_LOOKUP_PATH="$pwd/cmake.output" python3 -m pytest -Werror --strict-markers -vv -n auto test/cli - env: - TEST_CPPCHECK_INJECT_EXECUTOR: thread - - - name: Run test/cli (-j2) - run: | - pwd=$(pwd) - TEST_CPPCHECK_EXE_LOOKUP_PATH="$pwd/cmake.output" python3 -m pytest -Werror --strict-markers -vv -n auto test/cli - env: - TEST_CPPCHECK_INJECT_J: 2 - - - name: Run test/cli (--clang) - if: false - run: | - pwd=$(pwd) - TEST_CPPCHECK_EXE_LOOKUP_PATH="$pwd/cmake.output" python3 -m pytest -Werror --strict-markers -vv -n auto test/cli - env: - TEST_CPPCHECK_INJECT_CLANG: clang - - - name: Run test/cli (--cppcheck-build-dir) - run: | - pwd=$(pwd) - TEST_CPPCHECK_EXE_LOOKUP_PATH="$pwd/cmake.output" python3 -m pytest -Werror --strict-markers -vv -n auto test/cli - env: - TEST_CPPCHECK_INJECT_BUILDDIR: injected - - - name: Generate dependencies - if: false - run: | - # make sure auto-generated GUI files exist - make -C cmake.output autogen - make -C cmake.output gui-build-deps triage-build-ui-deps - - # TODO: disabled for now as it takes around 40 minutes to finish - # set --error-exitcode=0 so we only fail on sanitizer issues - since it uses threads for execution it will exit the whole process on the first issue - - name: Self check - if: false - run: | - selfcheck_options="-q -j$(nproc) --std=c++11 --template=selfcheck --showtime=file-total -D__GNUC__ --error-exitcode=0 --inline-suppr --suppressions-list=.selfcheck_suppressions --library=gnu --inconclusive --enable=style,performance,portability,warning,missingInclude --exception-handling --debug-warnings --check-level=exhaustive" - selfcheck_options="$selfcheck_options --executor=thread" - cppcheck_options="-D__CPPCHECK__ -DCHECK_INTERNAL -DHAVE_RULES --library=cppcheck-lib -Ilib -Iexternals/simplecpp/ -Iexternals/tinyxml2" - ec=0 - ./cmake.output/bin/cppcheck $selfcheck_options externals || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json frontend || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json -Ifrontend cli || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json --enable=internal lib || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt --addon=naming.json -Icmake.output/gui -Ifrontend -Igui gui/*.cpp cmake.output/gui/*.cpp || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -Icli -Ifrontend test/*.cpp || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -Icli tools/dmake/*.cpp || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt -Icmake.output/tools/triage -Igui tools/triage/*.cpp cmake.output/tools/triage/*.cpp || ec=1 - exit $ec diff --git a/.github/workflows/ubsan.yml b/.github/workflows/ubsan.yml deleted file mode 100644 index e1f64f25040..00000000000 --- a/.github/workflows/ubsan.yml +++ /dev/null @@ -1,152 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: undefined behaviour sanitizers - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -jobs: - build: - - runs-on: ubuntu-22.04 - - env: - QT_VERSION: 6.9.1 - UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1:report_error_type=1 - # TODO: figure out why there are cache misses with PCH enabled - CCACHE_SLOPPINESS: pch_defines,time_macros - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ github.job }}-${{ matrix.os }} - - - name: Set up Python 3.13 - uses: actions/setup-python@v5 - with: - python-version: '3.13' - check-latest: true - - - name: Install missing software on ubuntu - run: | - sudo apt-get update - sudo apt-get install -y cmake make libpcre3-dev libboost-container-dev libxml2-utils - sudo apt-get install -y libcups2-dev # required for Qt6PrintSupport in CMake since Qt 6.7.3 - - - name: Install clang - run: | - 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 - - - name: Install Qt ${{ env.QT_VERSION }} - uses: jurplel/install-qt-action@v4 - with: - version: ${{ env.QT_VERSION }} - modules: 'qtcharts' - setup-python: 'false' - cache: true - - - name: Install missing Python packages - run: | - python3 -m pip install pip --upgrade - python3 -m pip install pytest - python3 -m pip install pytest-timeout - python3 -m pip install pytest-xdist - python3 -m pip install psutil - - # TODO: disable warnings - - name: CMake - run: | - cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DUSE_QT6=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_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - env: - CC: clang-21 - CXX: clang++-21 - - - name: Build cppcheck - run: | - cmake --build cmake.output --target cppcheck -- -j $(nproc) - - - name: Build test - run: | - cmake --build cmake.output --target testrunner -- -j $(nproc) - - - name: Build GUI tests - run: | - cmake --build cmake.output --target gui-tests -- -j $(nproc) - - - name: Run tests - run: ./cmake.output/bin/testrunner - - - name: Run cfg tests - run: | - cmake --build cmake.output --target checkcfg -- -j $(nproc) - - - name: Run CTest - run: | - ctest --test-dir cmake.output --output-on-failure -j$(nproc) - - - name: Run test/cli - run: | - pwd=$(pwd) - TEST_CPPCHECK_EXE_LOOKUP_PATH="$pwd/cmake.output" python3 -m pytest -Werror --strict-markers -vv -n auto test/cli - - - name: Run test/cli (-j2) - run: | - pwd=$(pwd) - TEST_CPPCHECK_EXE_LOOKUP_PATH="$pwd/cmake.output" python3 -m pytest -Werror --strict-markers -vv -n auto test/cli - env: - TEST_CPPCHECK_INJECT_J: 2 - - - name: Run test/cli (--clang) - if: false - run: | - pwd=$(pwd) - TEST_CPPCHECK_EXE_LOOKUP_PATH="$pwd/cmake.output" python3 -m pytest -Werror --strict-markers -vv -n auto test/cli - env: - TEST_CPPCHECK_INJECT_CLANG: clang - - - name: Run test/cli (--cppcheck-build-dir) - run: | - pwd=$(pwd) - TEST_CPPCHECK_EXE_LOOKUP_PATH="$pwd/cmake.output" python3 -m pytest -Werror --strict-markers -vv -n auto test/cli - env: - TEST_CPPCHECK_INJECT_BUILDDIR: injected - - - name: Generate dependencies - run: | - # make sure auto-generated GUI files exist - make -C cmake.output autogen - make -C cmake.output gui-build-deps triage-build-ui-deps - - # TODO: only fail the step on sanitizer issues - since we use processes it will only fail the underlying process which will result in an cppcheckError - - name: Self check - run: | - selfcheck_options="-q -j$(nproc) --std=c++11 --template=selfcheck --showtime=file-total -D__GNUC__ --error-exitcode=1 --inline-suppr --suppressions-list=.selfcheck_suppressions --library=gnu --inconclusive --enable=style,performance,portability,warning,missingInclude --exception-handling --debug-warnings --check-level=exhaustive" - cppcheck_options="-D__CPPCHECK__ -DCHECK_INTERNAL -DHAVE_RULES --library=cppcheck-lib -Ilib -Iexternals/simplecpp/ -Iexternals/tinyxml2" - ec=0 - ./cmake.output/bin/cppcheck $selfcheck_options externals || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json frontend || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json -Ifrontend cli || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json --enable=internal lib || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt --addon=naming.json -Icmake.output/gui -Ifrontend -Igui gui/*.cpp cmake.output/gui/*.cpp || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -Icli -Ifrontend test/*.cpp || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -Icli tools/dmake/*.cpp || ec=1 - ./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt -Icmake.output/tools/triage -Igui tools/triage/*.cpp cmake.output/tools/triage/*.cpp || ec=1 - exit $ec diff --git a/.github/workflows/valgrind.yml b/.github/workflows/valgrind.yml deleted file mode 100644 index 7fd16382802..00000000000 --- a/.github/workflows/valgrind.yml +++ /dev/null @@ -1,65 +0,0 @@ -# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions -# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners -name: valgrind - -on: - push: - branches: - - 'main' - - 'releases/**' - - '2.*' - tags: - - '2.*' - pull_request: - -permissions: - contents: read - -jobs: - build: - - runs-on: ubuntu-22.04 - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.workflow }}-${{ runner.os }} - - - name: Install missing software - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - sudo apt-get install valgrind - sudo apt-get install libboost-container-dev - sudo apt-get install debuginfod - - - name: Build cppcheck - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - CXXFLAGS="-O1 -g -w -DHAVE_BOOST" make -j$(nproc) HAVE_RULES=yes MATCHCOMPILER=yes - - - name: Build test - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - CXXFLAGS="-O1 -g -w -DHAVE_BOOST" make -j$(nproc) testrunner HAVE_RULES=yes MATCHCOMPILER=yes - - - name: Run valgrind - run: | - ec=0 - valgrind --error-limit=yes --leak-check=full --num-callers=50 --show-reachable=yes --track-origins=yes --suppressions=valgrind/testrunner.supp --gen-suppressions=all --log-fd=9 --error-exitcode=42 ./testrunner TestGarbage TestOther TestSimplifyTemplate 9>memcheck.log || ec=1 - cat memcheck.log - exit $ec - # TODO: debuginfod.ubuntu.com is currently not responding to any requests causing it to run into a 40(!) minute timeout - #env: - # DEBUGINFOD_URLS: https://debuginfod.ubuntu.com - - - uses: actions/upload-artifact@v4 - if: success() || failure() - with: - name: Logs - path: ./*.log diff --git a/clang-tidy.md b/clang-tidy.md index 72df0375ca1..553a572d63e 100644 --- a/clang-tidy.md +++ b/clang-tidy.md @@ -129,7 +129,6 @@ Does not improve the readability. `readability-avoid-nested-conditional-operator`
`modernize-use-designated-initializers`
`readability-enum-initial-value`
-`modernize-use-trailing-return-type`
To be evaluated (need to remove exclusion). diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 7010e5c3f5e..bb4483741a4 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -189,7 +189,7 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[]) // Output a warning for the user if he tries to exclude headers const std::vector& ignored = getIgnoredPaths(); - const bool warn = std::any_of(ignored.cbegin(), ignored.cend(), [](const std::string& i) { + const bool warn = std::any_of(ignored.cbegin(), ignored.cend(), [](const std::string& i) -> bool { return Path::isHeader(i); }); if (warn) { @@ -210,7 +210,7 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[]) if (!mSettings.fileFilters.empty()) { // filter only for the selected filenames from all project files PathMatch filtermatcher(mSettings.fileFilters, Path::getCurrentPath()); - std::copy_if(fileSettingsRef.cbegin(), fileSettingsRef.cend(), std::back_inserter(fileSettings), [&](const FileSettings &fs) { + std::copy_if(fileSettingsRef.cbegin(), fileSettingsRef.cend(), std::back_inserter(fileSettings), [&](const FileSettings &fs) -> bool { return filtermatcher.match(fs.filename()); }); if (fileSettings.empty()) { @@ -228,11 +228,11 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[]) frontend::applyLang(fileSettings, mSettings, mEnforcedLang); // sort the markup last - std::copy_if(fileSettings.cbegin(), fileSettings.cend(), std::back_inserter(mFileSettings), [&](const FileSettings &fs) { + std::copy_if(fileSettings.cbegin(), fileSettings.cend(), std::back_inserter(mFileSettings), [&](const FileSettings &fs) -> bool { return !mSettings.library.markupFile(fs.filename()) || !mSettings.library.processMarkupAfterCode(fs.filename()); }); - std::copy_if(fileSettings.cbegin(), fileSettings.cend(), std::back_inserter(mFileSettings), [&](const FileSettings &fs) { + std::copy_if(fileSettings.cbegin(), fileSettings.cend(), std::back_inserter(mFileSettings), [&](const FileSettings &fs) -> bool { return mSettings.library.markupFile(fs.filename()) && mSettings.library.processMarkupAfterCode(fs.filename()); }); @@ -269,7 +269,7 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[]) while (it != filesResolved.end()) { const std::string& name = it->path(); // TODO: log if duplicated files were dropped - filesResolved.erase(std::remove_if(std::next(it), filesResolved.end(), [&](const FileWithDetails& entry) { + filesResolved.erase(std::remove_if(std::next(it), filesResolved.end(), [&](const FileWithDetails& entry) -> bool { return entry.path() == name; }), filesResolved.end()); ++it; @@ -292,11 +292,11 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[]) frontend::applyLang(files, mSettings, mEnforcedLang); // sort the markup last - std::copy_if(files.cbegin(), files.cend(), std::inserter(mFiles, mFiles.end()), [&](const FileWithDetails& entry) { + std::copy_if(files.cbegin(), files.cend(), std::inserter(mFiles, mFiles.end()), [&](const FileWithDetails& entry) -> bool { return !mSettings.library.markupFile(entry.path()) || !mSettings.library.processMarkupAfterCode(entry.path()); }); - std::copy_if(files.cbegin(), files.cend(), std::inserter(mFiles, mFiles.end()), [&](const FileWithDetails& entry) { + std::copy_if(files.cbegin(), files.cend(), std::inserter(mFiles, mFiles.end()), [&](const FileWithDetails& entry) -> bool { return mSettings.library.markupFile(entry.path()) && mSettings.library.processMarkupAfterCode(entry.path()); }); @@ -2176,7 +2176,7 @@ std::list CmdLineParser::filterFiles(const std::vector& filesResolved) { std::list files; PathMatch filtermatcher(fileFilters, Path::getCurrentPath()); - std::copy_if(filesResolved.cbegin(), filesResolved.cend(), std::inserter(files, files.end()), [&](const FileWithDetails& entry) { + std::copy_if(filesResolved.cbegin(), filesResolved.cend(), std::inserter(files, files.end()), [&](const FileWithDetails& entry) -> bool { return filtermatcher.match(entry.path()); }); return files; diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index 184cd00cd2f..f318a751024 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -416,7 +416,7 @@ int CppCheckExecutor::check_wrapper(const Settings& settings, Suppressions& supp bool CppCheckExecutor::reportSuppressions(const Settings &settings, const SuppressionList& suppressions, bool unusedFunctionCheckEnabled, const std::list &files, const std::list& fileSettings, ErrorLogger& errorLogger) { const auto& suppr = suppressions.getSuppressions(); - if (std::any_of(suppr.begin(), suppr.end(), [](const SuppressionList::Suppression& s) { + if (std::any_of(suppr.begin(), suppr.end(), [](const SuppressionList::Suppression& s) -> bool { return s.errorId == "unmatchedSuppression" && s.fileName.empty() && s.lineNumber == SuppressionList::Suppression::NO_LINE; })) return false; @@ -532,7 +532,7 @@ void StdLogger::writeCheckersReport(const Suppressions& supprs) CheckersReport checkersReport(mSettings, mActiveCheckers); const auto& suppressions = supprs.nomsg.getSuppressions(); - const bool summarySuppressed = std::any_of(suppressions.cbegin(), suppressions.cend(), [](const SuppressionList::Suppression& s) { + const bool summarySuppressed = std::any_of(suppressions.cbegin(), suppressions.cend(), [](const SuppressionList::Suppression& s) -> bool { return s.errorId == "checkersReport"; }); diff --git a/cli/filelister.cpp b/cli/filelister.cpp index 24acc186818..d789787b239 100644 --- a/cli/filelister.cpp +++ b/cli/filelister.cpp @@ -294,7 +294,7 @@ std::string FileLister::addFiles(std::list &files, const std::s std::string err = addFiles2(filesSorted, corrected_path, extra, recursive, ignored, debug); // files need to be sorted as the filesystems dosn't provide a stable order - filesSorted.sort([](const FileWithDetails& a, const FileWithDetails& b) { + filesSorted.sort([](const FileWithDetails& a, const FileWithDetails& b) -> bool { return a.path() < b.path(); }); files.insert(files.end(), std::make_move_iterator(filesSorted.begin()), std::make_move_iterator(filesSorted.end())); diff --git a/cli/processexecutor.cpp b/cli/processexecutor.cpp index b839e179750..2a31ff45e85 100644 --- a/cli/processexecutor.cpp +++ b/cli/processexecutor.cpp @@ -301,7 +301,7 @@ unsigned int ProcessExecutor::check() unsigned int fileCount = 0; unsigned int result = 0; - const std::size_t totalfilesize = std::accumulate(mFiles.cbegin(), mFiles.cend(), std::size_t(0), [](std::size_t v, const FileWithDetails& p) { + const std::size_t totalfilesize = std::accumulate(mFiles.cbegin(), mFiles.cend(), std::size_t(0), [](std::size_t v, const FileWithDetails& p) -> std::size_t { return v + p.size(); }); diff --git a/cli/singleexecutor.cpp b/cli/singleexecutor.cpp index 5d7e4a83f9d..c074355e466 100644 --- a/cli/singleexecutor.cpp +++ b/cli/singleexecutor.cpp @@ -42,7 +42,7 @@ unsigned int SingleExecutor::check() { unsigned int result = 0; - const std::size_t totalfilesize = std::accumulate(mFiles.cbegin(), mFiles.cend(), std::size_t(0), [](std::size_t v, const FileWithDetails& f) { + const std::size_t totalfilesize = std::accumulate(mFiles.cbegin(), mFiles.cend(), std::size_t(0), [](std::size_t v, const FileWithDetails& f) -> std::size_t { return v + f.size(); }); diff --git a/cli/threadexecutor.cpp b/cli/threadexecutor.cpp index 75b1a4524c6..1796a3dd2ec 100644 --- a/cli/threadexecutor.cpp +++ b/cli/threadexecutor.cpp @@ -92,7 +92,7 @@ class ThreadData mItNextFileSettings = mFileSettings.begin(); mTotalFiles = mFiles.size() + mFileSettings.size(); - mTotalFileSize = std::accumulate(mFiles.cbegin(), mFiles.cend(), std::size_t(0), [](std::size_t v, const FileWithDetails& p) { + mTotalFileSize = std::accumulate(mFiles.cbegin(), mFiles.cend(), std::size_t(0), [](std::size_t v, const FileWithDetails& p) -> std::size_t { return v + p.size(); }); } @@ -210,7 +210,7 @@ unsigned int ThreadExecutor::check() } } - unsigned int result = std::accumulate(threadFutures.begin(), threadFutures.end(), 0U, [](unsigned int v, std::future& f) { + unsigned int result = std::accumulate(threadFutures.begin(), threadFutures.end(), 0U, [](unsigned int v, std::future& f) -> unsigned int { return v + f.get(); }); diff --git a/gui/checkthread.cpp b/gui/checkthread.cpp index 6c83d0006a8..bfe2fb07852 100644 --- a/gui/checkthread.cpp +++ b/gui/checkthread.cpp @@ -420,7 +420,7 @@ void CheckThread::parseClangErrors(const QString &tool, const QString &file0, QS continue; std::list callstack; - std::transform(e.errorPath.cbegin(), e.errorPath.cend(), std::back_inserter(callstack), [](const QErrorPathItem& path) { + std::transform(e.errorPath.cbegin(), e.errorPath.cend(), std::back_inserter(callstack), [](const QErrorPathItem& path) -> ErrorMessage::FileLocation { return ErrorMessage::FileLocation(path.file.toStdString(), path.info.toStdString(), path.line, path.column); }); const std::string f0 = file0.toStdString(); diff --git a/gui/compliancereportdialog.cpp b/gui/compliancereportdialog.cpp index ae903f47dc4..c2c1229f4c0 100644 --- a/gui/compliancereportdialog.cpp +++ b/gui/compliancereportdialog.cpp @@ -80,7 +80,7 @@ static void addHeaders(const QString& file1, QSet &allFiles) { static std::vector toStdStringList(const QStringList& from) { std::vector ret; - std::transform(from.cbegin(), from.cend(), std::back_inserter(ret), [](const QString& e) { + std::transform(from.cbegin(), from.cend(), std::back_inserter(ret), [](const QString& e) -> std::string { return e.toStdString(); }); return ret; diff --git a/gui/filelist.cpp b/gui/filelist.cpp index cdfa6676a4e..4c857a58c81 100644 --- a/gui/filelist.cpp +++ b/gui/filelist.cpp @@ -111,7 +111,7 @@ void FileList::addExcludeList(const QStringList &paths) static std::vector toStdStringList(const QStringList &stringList) { std::vector ret; - std::transform(stringList.cbegin(), stringList.cend(), std::back_inserter(ret), [](const QString& s) { + std::transform(stringList.cbegin(), stringList.cend(), std::back_inserter(ret), [](const QString& s) -> std::string { return s.toStdString(); }); return ret; diff --git a/gui/main.cpp b/gui/main.cpp index 22e1bc8cbd0..ed201981786 100644 --- a/gui/main.cpp +++ b/gui/main.cpp @@ -56,7 +56,7 @@ int main(int argc, char *argv[]) // Set data dir.. const QStringList args = QApplication::arguments(); - auto it = std::find_if(args.cbegin(), args.cend(), [](const QString& arg) { + auto it = std::find_if(args.cbegin(), args.cend(), [](const QString& arg) -> bool { return arg.startsWith("--data-dir="); }); if (it != args.end()) { diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index d4dbc69bf9d..31a8b764a7e 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -569,7 +569,7 @@ void MainWindow::doAnalyzeProject(ImportProject p, const bool checkLibrary, cons if (mProjectFile) { std::vector v; const QStringList excluded = mProjectFile->getExcludedPaths(); - std::transform(excluded.cbegin(), excluded.cend(), std::back_inserter(v), [](const QString& e) { + std::transform(excluded.cbegin(), excluded.cend(), std::back_inserter(v), [](const QString& e) -> std::string { return e.toStdString(); }); p.ignorePaths(v); @@ -578,7 +578,7 @@ void MainWindow::doAnalyzeProject(ImportProject p, const bool checkLibrary, cons const Platform::Type platform = static_cast(mSettings->value(SETTINGS_CHECKED_PLATFORM, 0).toInt()); std::vector configurations; const QStringList configs = mProjectFile->getVsConfigurations(); - std::transform(configs.cbegin(), configs.cend(), std::back_inserter(configurations), [](const QString& e) { + std::transform(configs.cbegin(), configs.cend(), std::back_inserter(configurations), [](const QString& e) -> std::string { return e.toStdString(); }); p.selectVsConfigurations(platform, configurations); @@ -689,7 +689,7 @@ void MainWindow::doAnalyzeFiles(const QStringList &files, const bool checkLibrar if (!checkSettings.buildDir.empty()) { checkSettings.loadSummaries(); std::list sourcefiles; - std::transform(fileNames.cbegin(), fileNames.cend(), std::back_inserter(sourcefiles), [](const QString& s) { + std::transform(fileNames.cbegin(), fileNames.cend(), std::back_inserter(sourcefiles), [](const QString& s) -> std::string { return s.toStdString(); }); AnalyzerInformation::writeFilesTxt(checkSettings.buildDir, sourcefiles, checkSettings.userDefines, {}); @@ -2317,7 +2317,7 @@ void MainWindow::changeReportType() { mUI->mResults->setReportType(reportType); - auto setTextAndHint = [](QAction* a, const QString& s) { + auto setTextAndHint = [](QAction* a, const QString& s) -> void { a->setVisible(!s.isEmpty()); a->setText(s); a->setToolTip(s); @@ -2361,7 +2361,7 @@ void MainWindow::changeReportType() { std::list MainWindow::enrichFilesForAnalysis(const QStringList& fileNames, const Settings& settings) const { std::list fdetails; - std::transform(fileNames.cbegin(), fileNames.cend(), std::back_inserter(fdetails), [](const QString& f) { + std::transform(fileNames.cbegin(), fileNames.cend(), std::back_inserter(fdetails), [](const QString& f) -> FileWithDetails { return FileWithDetails{f.toStdString(), Standards::Language::None, static_cast(QFile(f).size())}; }); const Standards::Language enforcedLang = static_cast(mSettings->value(SETTINGS_ENFORCED_LANGUAGE, 0).toInt()); diff --git a/gui/resultstree.cpp b/gui/resultstree.cpp index d2801c77a4b..8e8c43d9cf4 100644 --- a/gui/resultstree.cpp +++ b/gui/resultstree.cpp @@ -811,7 +811,7 @@ void ResultsTree::contextMenuEvent(QContextMenuEvent * e) { auto *action = new QAction(tr("No tag"), tagMenu); tagMenu->addAction(action); - connect(action, &QAction::triggered, [=]() { + connect(action, &QAction::triggered, [=]() -> void { tagSelectedItems(QString()); }); } @@ -819,7 +819,7 @@ void ResultsTree::contextMenuEvent(QContextMenuEvent * e) for (const QString& tagstr : currentProject->getTags()) { auto *action = new QAction(tagstr, tagMenu); tagMenu->addAction(action); - connect(action, &QAction::triggered, [=]() { + connect(action, &QAction::triggered, [=]() -> void { tagSelectedItems(tagstr); }); } @@ -1293,7 +1293,7 @@ void ResultsTree::saveErrors(Report *report, const QStandardItem *fileItem) cons static int indexOf(const QList &list, const ErrorItem &item) { - auto it = std::find_if(list.cbegin(), list.cend(), [&](const ErrorItem& e) { + auto it = std::find_if(list.cbegin(), list.cend(), [&](const ErrorItem& e) -> bool { return ErrorItem::sameCID(item, e); }); return it == list.cend() ? -1 : static_cast(std::distance(list.cbegin(), it)); diff --git a/gui/threadhandler.cpp b/gui/threadhandler.cpp index ad4d0e2a61d..177d645339b 100644 --- a/gui/threadhandler.cpp +++ b/gui/threadhandler.cpp @@ -262,7 +262,7 @@ std::list ThreadHandler::getReCheckFiles(bool all) const std::set unmodified; std::list files; - std::copy_if(mLastFiles.cbegin(), mLastFiles.cend(), std::back_inserter(files), [&](const FileWithDetails &f) { + std::copy_if(mLastFiles.cbegin(), mLastFiles.cend(), std::back_inserter(files), [&](const FileWithDetails &f) -> bool { return needsReCheck(QString::fromStdString(f.path()), modified, unmodified); }); return files; diff --git a/gui/threadresult.cpp b/gui/threadresult.cpp index 8cbd5bd6d88..54b76060db1 100644 --- a/gui/threadresult.cpp +++ b/gui/threadresult.cpp @@ -96,7 +96,7 @@ void ThreadResult::setFiles(std::list files) // Determine the total size of all of the files to check, so that we can // show an accurate progress estimate - quint64 sizeOfFiles = std::accumulate(mFiles.cbegin(), mFiles.cend(), 0, [](quint64 total, const FileWithDetails& file) { + quint64 sizeOfFiles = std::accumulate(mFiles.cbegin(), mFiles.cend(), 0, [](quint64 total, const FileWithDetails& file) -> quint64 { return total + file.size(); }); mMaxProgress = sizeOfFiles; @@ -115,7 +115,7 @@ void ThreadResult::setProject(const ImportProject &prj) // Determine the total size of all of the files to check, so that we can // show an accurate progress estimate - mMaxProgress = std::accumulate(prj.fileSettings.begin(), prj.fileSettings.end(), quint64{ 0 }, [](quint64 v, const FileSettings& fs) { + mMaxProgress = std::accumulate(prj.fileSettings.begin(), prj.fileSettings.end(), quint64{ 0 }, [](quint64 v, const FileSettings& fs) -> quint64 { return v + QFile(QString::fromStdString(fs.filename())).size(); }); } diff --git a/gui/translationhandler.cpp b/gui/translationhandler.cpp index d8160525856..5fb54b1eba2 100644 --- a/gui/translationhandler.cpp +++ b/gui/translationhandler.cpp @@ -181,7 +181,7 @@ void TranslationHandler::addTranslation(const char *name, const char *filename) int TranslationHandler::getLanguageIndexByCode(const QString &code) const { - auto it = std::find_if(mTranslations.cbegin(), mTranslations.cend(), [&](const TranslationInfo& ti) { + auto it = std::find_if(mTranslations.cbegin(), mTranslations.cend(), [&](const TranslationInfo& ti) -> bool { return ti.mCode == code || ti.mCode == code.left(2); }); return it == mTranslations.cend() ? -1 : static_cast(std::distance(mTranslations.cbegin(), it)); diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 8e6ee974f15..e28597871d6 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -664,7 +664,7 @@ const Token* getParentLifetime(const Token* tok, const Library& library) if (members.size() < 2) return tok; // Find the first local variable, temporary, or array - auto it = std::find_if(members.crbegin(), members.crend(), [&](const Token* tok2) { + auto it = std::find_if(members.crbegin(), members.crend(), [&](const Token* tok2) -> bool { const Variable* var = tok2->variable(); if (var) return var->isLocal() || var->isArgument(); @@ -675,7 +675,7 @@ const Token* getParentLifetime(const Token* tok, const Library& library) if (it == members.rend()) return tok; // If any of the submembers are borrowed types then stop - if (std::any_of(it.base() - 1, members.cend() - 1, [&](const Token* tok2) { + if (std::any_of(it.base() - 1, members.cend() - 1, [&](const Token* tok2) -> bool { const Token* obj = getParentLifetimeObject(tok2); if (!obj) return false; @@ -976,7 +976,7 @@ bool extractForLoopValues(const Token *forToken, knownInitValue = initExpr->astOperand2()->hasKnownIntValue(); initValue = minInitValue.front(); partialCond = Token::Match(condExpr, "%oror%|&&"); - visitAstNodes(condExpr, [varid, &condExpr](const Token *tok) { + visitAstNodes(condExpr, [varid, &condExpr](const Token *tok) -> ChildrenToVisit { if (Token::Match(tok, "%oror%|&&")) return ChildrenToVisit::op1_and_op2; if (Token::Match(tok, "<|<=") && tok->isBinaryOp() && tok->astOperand1()->varId() == varid && tok->astOperand2()->hasKnownIntValue()) { @@ -1068,7 +1068,7 @@ bool isAliasOf(const Token* tok, const Token* expr, int* indirect) *indirect = 1; for (const ReferenceToken& ref : followAllReferences(tok)) { const bool pointer = astIsPointer(ref.token); - r = findAstNode(expr, [&](const Token* childTok) { + r = findAstNode(expr, [&](const Token* childTok) -> bool { if (childTok->exprId() == 0) return false; if (ref.token != tok && expr->exprId() == childTok->exprId()) { @@ -1081,7 +1081,7 @@ bool isAliasOf(const Token* tok, const Token* expr, int* indirect) continue; if (val.isLocalLifetimeValue() || (pointer && val.isSymbolicValue() && val.intvalue == 0)) { if (findAstNode(val.tokvalue, - [&](const Token* aliasTok) { + [&](const Token* aliasTok) -> bool { return aliasTok != childTok && aliasTok->exprId() == childTok->exprId(); })) { return true; @@ -1151,7 +1151,7 @@ bool exprDependsOnThis(const Token* expr, bool onVar, nonneg int depth) static bool hasUnknownVars(const Token* startTok) { bool result = false; - visitAstNodes(startTok, [&](const Token* tok) { + visitAstNodes(startTok, [&](const Token* tok) -> ChildrenToVisit { if (tok->varId() > 0 && !tok->variable()) { result = true; return ChildrenToVisit::done; @@ -1425,7 +1425,7 @@ static bool compareKnownValue(const Token * const tok1, const Token * const tok2 bool isEqualKnownValue(const Token * const tok1, const Token * const tok2) { - return compareKnownValue(tok1, tok2, [&](const ValueFlow::Value& v1, const ValueFlow::Value& v2, bool sameLifetime) { + return compareKnownValue(tok1, tok2, [&](const ValueFlow::Value& v1, const ValueFlow::Value& v2, bool sameLifetime) -> bool { bool r = v1.equalValue(v2); if (v1.isIteratorValue()) { r &= sameLifetime; @@ -1436,7 +1436,7 @@ bool isEqualKnownValue(const Token * const tok1, const Token * const tok2) static inline bool isDifferentKnownValues(const Token * const tok1, const Token * const tok2) { - return compareKnownValue(tok1, tok2, [&](const ValueFlow::Value& v1, const ValueFlow::Value& v2, bool sameLifetime) { + return compareKnownValue(tok1, tok2, [&](const ValueFlow::Value& v1, const ValueFlow::Value& v2, bool sameLifetime) -> bool { bool r = v1.equalValue(v2); if (v1.isIteratorValue()) { r &= sameLifetime; @@ -1450,7 +1450,7 @@ static inline bool isSameConstantValue(bool macro, const Token* tok1, const Toke if (tok1 == nullptr || tok2 == nullptr) return false; - auto adjustForCast = [](const Token* tok) { + auto adjustForCast = [](const Token* tok) -> const Token* { if (tok->astOperand2() && Token::Match(tok->previous(), "%type% (|{") && tok->previous()->isStandardType()) return tok->astOperand2(); return tok; @@ -1539,7 +1539,7 @@ bool isUsedAsBool(const Token* const tok, const Settings& settings) if (parent->str() == "," && parent->isInitComma()) return false; std::vector vtParents = getParentValueTypes(tok, settings); - return std::any_of(vtParents.cbegin(), vtParents.cend(), [&](const ValueType& vt) { + return std::any_of(vtParents.cbegin(), vtParents.cend(), [&](const ValueType& vt) -> bool { return vt.pointer == 0 && vt.type == ValueType::BOOL; }); } @@ -1981,7 +1981,7 @@ bool isOppositeExpression(const Token * const tok1, const Token * const tok2, co static bool functionModifiesArguments(const Function* f) { - return std::any_of(f->argumentList.cbegin(), f->argumentList.cend(), [](const Variable& var) { + return std::any_of(f->argumentList.cbegin(), f->argumentList.cend(), [](const Variable& var) -> bool { if (var.isReference() || var.isPointer()) return !var.isConst(); return true; @@ -2009,7 +2009,7 @@ bool isConstFunctionCall(const Token* ftok, const Library& library) // Check for const overloaded function that just return the const version if (!Function::returnsConst(f)) { std::vector fs = f->getOverloadedFunctions(); - if (std::any_of(fs.cbegin(), fs.cend(), [&](const Function* g) { + if (std::any_of(fs.cbegin(), fs.cend(), [&](const Function* g) -> bool { if (f == g) return false; if (f->argumentList.size() != g->argumentList.size()) @@ -2058,7 +2058,7 @@ bool isConstFunctionCall(const Token* ftok, const Library& library) std::vector args = getArguments(ftok); if (args.empty()) return false; - return constMember && std::all_of(args.cbegin(), args.cend(), [](const Token* tok) { + return constMember && std::all_of(args.cbegin(), args.cend(), [](const Token* tok) -> bool { const Variable* var = tok->variable(); if (var) return var->isConst(); @@ -2116,7 +2116,7 @@ bool isUniqueExpression(const Token* tok) if (!scope) return true; const std::string returnType = fun->retType ? fun->retType->name() : fun->retDef->stringifyList(fun->tokenDef); - if (!std::all_of(scope->functionList.begin(), scope->functionList.end(), [&](const Function& f) { + if (!std::all_of(scope->functionList.begin(), scope->functionList.end(), [&](const Function& f) -> bool { if (f.type != FunctionType::eFunction) return true; @@ -2133,7 +2133,7 @@ bool isUniqueExpression(const Token* tok) // Iterate over the variables in scope and the parameters of the function if possible const Function * fun = scope->function; - auto pred = [=](const Variable& v) { + auto pred = [=](const Variable& v) -> bool { if (varType) return v.type() && v.type()->name() == varType->name() && v.name() != var->name(); return v.isFloatingType() == var->isFloatingType() && @@ -2636,7 +2636,7 @@ bool isVariableChanged(const Token *tok, int indirect, const Settings &settings, if (indirect == 0 && tok2->astParent() && tok2->astParent()->tokType() == Token::eIncDecOp) return true; - auto skipRedundantPtrOp = [](const Token* tok, const Token* parent) { + auto skipRedundantPtrOp = [](const Token* tok, const Token* parent) -> const Token * { const Token* gparent = parent ? parent->astParent() : nullptr; while (parent && gparent && ((parent->isUnaryOp("*") && gparent->isUnaryOp("&")) || (parent->isUnaryOp("&") && gparent->isUnaryOp("*")))) { tok = gparent; @@ -2932,7 +2932,7 @@ bool isExpressionChangedAt(const Token* expr, const Settings& settings, int depth) { - return isExpressionChangedAt([&] { + return isExpressionChangedAt([&]() -> const Token * { return expr; }, tok, indirect, expr->exprId(), globalvar, settings, depth); } @@ -2943,7 +2943,7 @@ Token* findVariableChanged(Token *start, const Token *end, int indirect, const n return nullptr; if (depth < 0) return start; - auto getExprTok = utils::memoize([&] { + auto getExprTok = utils::memoize([&]() -> const Token * { return findExpression(start, exprid); }); for (Token *tok = start; tok != end; tok = tok->next()) { @@ -2984,10 +2984,10 @@ bool isVariablesChanged(const Token* start, const Settings& settings) { std::set varids; - std::transform(vars.cbegin(), vars.cend(), std::inserter(varids, varids.begin()), [](const Variable* var) { + std::transform(vars.cbegin(), vars.cend(), std::inserter(varids, varids.begin()), [](const Variable* var) -> nonneg int { return var->declarationId(); }); - const bool globalvar = std::any_of(vars.cbegin(), vars.cend(), [](const Variable* var) { + const bool globalvar = std::any_of(vars.cbegin(), vars.cend(), [](const Variable* var) -> bool { return var->isGlobal(); }); for (const Token* tok = start; tok && tok != end; tok = tok->next()) { @@ -3170,7 +3170,7 @@ std::vector getArguments(const Token* ftok) { int getArgumentPos(const Variable* var, const Function* f) { - auto arg_it = std::find_if(f->argumentList.cbegin(), f->argumentList.cend(), [&](const Variable& v) { + auto arg_it = std::find_if(f->argumentList.cbegin(), f->argumentList.cend(), [&](const Variable& v)-> bool { return v.nameToken() == var->nameToken(); }); if (arg_it == f->argumentList.end()) @@ -3349,7 +3349,7 @@ bool isConstVarExpression(const Token *tok, const std::function args = getArguments(tok); if (args.empty() && tok->previous()->function() && tok->previous()->function()->isConstexpr()) return true; - return !args.empty() && std::all_of(args.cbegin(), args.cend(), [&](const Token* t) { + return !args.empty() && std::all_of(args.cbegin(), args.cend(), [&](const Token* t) -> bool { return isConstVarExpression(t, skipPredicate); }); } @@ -3397,7 +3397,7 @@ static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings return ExprUsage::Used; if (nCtor == 1) { const Scope* scope = ftok->variable()->type()->classScope; - auto it = std::find_if(scope->functionList.begin(), scope->functionList.end(), [](const Function& f) { + auto it = std::find_if(scope->functionList.begin(), scope->functionList.end(), [](const Function& f) -> bool { return f.isConstructor(); }); if (it != scope->functionList.end()) @@ -3626,7 +3626,7 @@ bool isGlobalData(const Token *expr) bool globalData = false; bool var = false; visitAstNodes(expr, - [expr, &globalData, &var](const Token *tok) { + [expr, &globalData, &var](const Token *tok) -> ChildrenToVisit { if (tok->varId()) var = true; if (tok->varId() && !tok->variable()) { @@ -3750,7 +3750,7 @@ bool isExhaustiveSwitch(const Token *startbrace) if (condition->valueType()->isEnum()) { const std::vector &enumList = condition->valueType()->typeScope->enumeratorList; - return std::all_of(enumList.cbegin(), enumList.cend(), [&](const Enumerator &e) { + return std::all_of(enumList.cbegin(), enumList.cend(), [&](const Enumerator &e) -> bool { return !e.value_known || switchValues.count(e.value); }); } diff --git a/lib/astutils.h b/lib/astutils.h index f7a245c0430..d72988e376f 100644 --- a/lib/astutils.h +++ b/lib/astutils.h @@ -93,7 +93,7 @@ template const Token* findAstNode(const Token* ast, const TFunc& pred) { const Token* result = nullptr; - visitAstNodes(ast, [&](const Token* tok) { + visitAstNodes(ast, [&](const Token* tok) -> ChildrenToVisit { // no suggestion if (pred(tok)) { result = tok; return ChildrenToVisit::done; diff --git a/lib/calculate.h b/lib/calculate.h index 610acd5584a..cac476b9283 100644 --- a/lib/calculate.h +++ b/lib/calculate.h @@ -49,7 +49,7 @@ bool isZero(T x) template R calculate(const std::string& s, const T& x, const T& y, bool* error = nullptr) { - auto wrap = [](T z) { + auto wrap = [](T z) { // TODO: no suggestion return R{z}; }; constexpr MathLib::bigint maxBitsShift = sizeof(MathLib::bigint) * 8; diff --git a/lib/check.cpp b/lib/check.cpp index 58b8dbfe0e1..77a2c9a4d17 100644 --- a/lib/check.cpp +++ b/lib/check.cpp @@ -46,7 +46,7 @@ Check::Check(const std::string &aname) } // make sure the instances are sorted - const auto it = std::find_if(instances().begin(), instances().end(), [&](const Check* i) { + const auto it = std::find_if(instances().begin(), instances().end(), [&](const Check* i) -> bool { return i->name() > aname; }); if (it == instances().end()) diff --git a/lib/checkassert.cpp b/lib/checkassert.cpp index 3ab55967ede..efde67c8b02 100644 --- a/lib/checkassert.cpp +++ b/lib/checkassert.cpp @@ -68,7 +68,7 @@ void CheckAssert::assertWithSideEffects() continue; if (Library::getContainerYield(tmp->next()) != Library::Container::Yield::NO_YIELD) // bailout, assume read access continue; - if (std::any_of(f->argumentChecks.begin(), f->argumentChecks.end(), [](const std::pair& ac) { + if (std::any_of(f->argumentChecks.begin(), f->argumentChecks.end(), [](const std::pair& ac) -> bool { return ac.second.iteratorInfo.container > 0; // bailout, takes iterators -> assume read access })) continue; diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp index 8b9023d9473..7be082b0a75 100644 --- a/lib/checkautovariables.cpp +++ b/lib/checkautovariables.cpp @@ -252,7 +252,7 @@ static bool hasOverloadedAssignment(const Token* tok, bool& inconclusive) if (vt->container && vt->container->stdStringLike) return true; if (vt->typeScope) - return std::any_of(vt->typeScope->functionList.begin(), vt->typeScope->functionList.end(), [](const Function& f) { // TODO: compare argument type + return std::any_of(vt->typeScope->functionList.begin(), vt->typeScope->functionList.end(), [](const Function& f) -> bool { // TODO: compare argument type return f.name() == "operator="; }); return false; @@ -427,7 +427,7 @@ static bool isInScope(const Token * tok, const Scope * scope) const Scope * tokScope = tok->scope(); if (!tokScope) return false; - if (std::any_of(tokScope->nestedList.cbegin(), tokScope->nestedList.cend(), [&](const Scope* argScope) { + if (std::any_of(tokScope->nestedList.cbegin(), tokScope->nestedList.cend(), [&](const Scope* argScope) -> bool { return argScope && argScope->isNestedIn(scope); })) return true; diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index a43d5b26ee8..4706d130b2e 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -198,7 +198,7 @@ static bool getDimensionsEtc(const Token * const arrayToken, const Settings &set dimensions = array->variable()->dimensions(); if (dimensions[0].num <= 1 || !dimensions[0].tok) { visitAstNodes(arrayToken, - [&](const Token *child) { + [&](const Token *child) -> ChildrenToVisit { if (child->originalName() == "->") { mightBeLarger = true; return ChildrenToVisit::none; @@ -564,7 +564,7 @@ ValueFlow::Value CheckBufferOverrun::getBufferSize(const Token *bufTok) const if (!var || var->isPointer()) return ValueFlow::Value(-1); - const MathLib::bigint dim = std::accumulate(var->dimensions().cbegin(), var->dimensions().cend(), 1LL, [](MathLib::bigint i1, const Dimension &dim) { + const MathLib::bigint dim = std::accumulate(var->dimensions().cbegin(), var->dimensions().cend(), 1LL, [](MathLib::bigint i1, const Dimension &dim) -> MathLib::bigint { return i1 * dim.num; }); @@ -676,7 +676,7 @@ void CheckBufferOverrun::bufferOverflow() continue; } } - const bool error = std::none_of(minsizes->begin(), minsizes->end(), [&](const Library::ArgumentChecks::MinSize &minsize) { + const bool error = std::none_of(minsizes->begin(), minsizes->end(), [&](const Library::ArgumentChecks::MinSize &minsize) -> bool { return checkBufferSize(tok, minsize, args, bufferSize.intvalue, *mSettings, mTokenizer); }); if (error) @@ -774,7 +774,7 @@ void CheckBufferOverrun::stringNotZeroTerminated() continue; if (Token::simpleMatch(args[1], "(") && Token::simpleMatch(args[1]->astOperand1(), ". c_str") && args[1]->astOperand1()->astOperand1()) { const std::list& contValues = args[1]->astOperand1()->astOperand1()->values(); - auto it = std::find_if(contValues.cbegin(), contValues.cend(), [](const ValueFlow::Value& value) { + auto it = std::find_if(contValues.cbegin(), contValues.cend(), [](const ValueFlow::Value& value) -> bool { return value.isContainerSizeValue() && !value.isImpossible(); }); if (it != contValues.end() && it->intvalue < sizeToken->getKnownIntValue()) @@ -1105,12 +1105,12 @@ void CheckBufferOverrun::objectIndex() std::copy_if(idx->values().cbegin(), idx->values().cend(), std::back_inserter(idxValues), - [&](const ValueFlow::Value& vidx) { + [&](const ValueFlow::Value& vidx) -> bool { if (!vidx.isIntValue()) return false; return vidx.path == v.path || vidx.path == 0; }); - if (std::any_of(idxValues.cbegin(), idxValues.cend(), [&](const ValueFlow::Value& vidx) { + if (std::any_of(idxValues.cbegin(), idxValues.cend(), [&](const ValueFlow::Value& vidx) -> bool { if (vidx.isImpossible()) return (vidx.intvalue == 0); return (vidx.intvalue != 0); diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 5a6469ae8fb..08925c31a30 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -102,7 +102,7 @@ static bool isVclTypeInit(const Type *type) { if (!type) return false; - return std::any_of(type->derivedFrom.begin(), type->derivedFrom.end(), [&](const Type::BaseInfo& baseInfo) { + return std::any_of(type->derivedFrom.begin(), type->derivedFrom.end(), [&](const Type::BaseInfo& baseInfo) -> bool { if (!baseInfo.type) return true; if (isVclTypeInit(baseInfo.type)) @@ -137,10 +137,10 @@ void CheckClass::constructors() const bool unusedTemplate = Token::simpleMatch(scope->classDef->previous(), ">"); - const bool usedInUnion = std::any_of(mSymbolDatabase->scopeList.cbegin(), mSymbolDatabase->scopeList.cend(), [&](const Scope& unionScope) { + const bool usedInUnion = std::any_of(mSymbolDatabase->scopeList.cbegin(), mSymbolDatabase->scopeList.cend(), [&](const Scope& unionScope) -> bool { if (unionScope.type != ScopeType::eUnion) return false; - return std::any_of(unionScope.varlist.cbegin(), unionScope.varlist.cend(), [&](const Variable& var) { + return std::any_of(unionScope.varlist.cbegin(), unionScope.varlist.cend(), [&](const Variable& var) -> bool { return var.type() && var.type()->classScope == scope; }); }); @@ -349,7 +349,7 @@ void CheckClass::checkExplicitConstructors() // Is class abstract? Maybe this test is over-simplification, but it will suffice for simple cases, // and it will avoid false positives. - const bool isAbstractClass = std::any_of(scope->functionList.cbegin(), scope->functionList.cend(), [](const Function& func) { + const bool isAbstractClass = std::any_of(scope->functionList.cbegin(), scope->functionList.cend(), [](const Function& func) -> bool { return func.isPure(); }); @@ -657,7 +657,7 @@ bool CheckClass::canNotMove(const Scope *scope) static void getAllVariableMembers(const Scope *scope, std::vector& varList) { - std::transform(scope->varlist.cbegin(), scope->varlist.cend(), std::back_inserter(varList), [](const Variable& var) { + std::transform(scope->varlist.cbegin(), scope->varlist.cend(), std::back_inserter(varList), [](const Variable& var) -> const Variable * { return &var; }); if (scope->definedType) { @@ -677,7 +677,7 @@ std::vector CheckClass::createUsageList(const Scope *scope) std::vector varlist; getAllVariableMembers(scope, varlist); ret.reserve(varlist.size()); - std::transform(varlist.cbegin(), varlist.cend(), std::back_inserter(ret), [](const Variable* var) { + std::transform(varlist.cbegin(), varlist.cend(), std::back_inserter(ret), [](const Variable* var) -> Usage { return Usage(var); }); return ret; @@ -685,7 +685,7 @@ std::vector CheckClass::createUsageList(const Scope *scope) void CheckClass::assignVar(std::vector &usageList, nonneg int varid) { - auto it = std::find_if(usageList.begin(), usageList.end(), [varid](const Usage& usage) { + auto it = std::find_if(usageList.begin(), usageList.end(), [varid](const Usage& usage) -> bool { return usage.var->declarationId() == varid; }); if (it != usageList.end()) @@ -698,7 +698,7 @@ void CheckClass::assignVar(std::vector &usageList, const Token* vartok) assignVar(usageList, vartok->varId()); return; } - auto it = std::find_if(usageList.begin(), usageList.end(), [vartok](const Usage& usage) { + auto it = std::find_if(usageList.begin(), usageList.end(), [vartok](const Usage& usage) -> bool { // FIXME: This is a workaround when varid is not set for a derived member return usage.var->name() == vartok->str(); }); @@ -708,7 +708,7 @@ void CheckClass::assignVar(std::vector &usageList, const Token* vartok) void CheckClass::initVar(std::vector &usageList, nonneg int varid) { - auto it = std::find_if(usageList.begin(), usageList.end(), [varid](const Usage& usage) { + auto it = std::find_if(usageList.begin(), usageList.end(), [varid](const Usage& usage) -> bool { return usage.var->declarationId() == varid; }); if (it != usageList.end()) @@ -755,7 +755,7 @@ bool CheckClass::isBaseClassMutableMemberFunc(const Token *tok, const Scope *sco if (derivedFrom && derivedFrom->classScope) { const std::list& functionList = derivedFrom->classScope->functionList; - if (std::any_of(functionList.cbegin(), functionList.cend(), [&](const Function& func) { + if (std::any_of(functionList.cbegin(), functionList.cend(), [&](const Function& func) -> bool { return func.tokenDef->str() == tok->str() && !func.isStatic() && !func.isConst(); })) return true; @@ -868,7 +868,7 @@ void CheckClass::initializeVarList(const Function &func, std::listnext(), "%var% . %name% (") && !(ftok->next()->valueType() && ftok->next()->valueType()->pointer)) { - if (std::any_of(scope->varlist.cbegin(), scope->varlist.cend(), [&](const Variable& var) { + if (std::any_of(scope->varlist.cbegin(), scope->varlist.cend(), [&](const Variable& var) -> bool { return var.declarationId() == ftok->next()->varId(); })) /** @todo false negative: we assume function changes variable state */ @@ -1205,7 +1205,7 @@ void CheckClass::initializationListUsage() // Access local var member in rhs => do not warn bool localmember = false; visitAstNodes(tok->next()->astOperand2(), - [&](const Token *rhs) { + [&](const Token *rhs) -> ChildrenToVisit { if (rhs->str() == "." && rhs->astOperand1() && rhs->astOperand1()->variable() && rhs->astOperand1()->variable()->isLocal()) localmember = true; return ChildrenToVisit::op1_and_op2; @@ -1215,7 +1215,7 @@ void CheckClass::initializationListUsage() bool allowed = true; visitAstNodes(tok->next()->astOperand2(), - [&](const Token *tok2) { + [&](const Token *tok2) -> ChildrenToVisit { const Variable* var2 = tok2->variable(); if (var2) { if (var2->scope() == owner && tok2->strAt(-1)!=".") { // Is there a dependency between two member variables? @@ -1902,7 +1902,7 @@ bool CheckClass::hasAssignSelf(const Function *func, const Token *rhs, const Tok bool ret = false; visitAstNodes(tok->next()->astOperand2(), - [&](const Token *tok2) { + [&](const Token *tok2) -> ChildrenToVisit { if (!Token::Match(tok2, "==|!=")) return ChildrenToVisit::op1_and_op2; if (Token::simpleMatch(tok2->astOperand1(), "this")) @@ -1958,7 +1958,7 @@ void CheckClass::virtualDestructor() if (printInconclusive) { const Function *destructor = scope->getDestructor(); if (destructor && !destructor->hasVirtualSpecifier() && destructor->access == AccessControl::Public) { - if (std::any_of(scope->functionList.cbegin(), scope->functionList.cend(), [](const Function& func) { + if (std::any_of(scope->functionList.cbegin(), scope->functionList.cend(), [](const Function& func) -> bool { return func.hasVirtualSpecifier(); })) inconclusiveErrors.push_back(destructor); @@ -2216,7 +2216,7 @@ void CheckClass::checkConst() continue; if (suggestStatic && func.isConst()) { const auto overloads = func.getOverloadedFunctions(); - if (overloads.size() > 1 && std::any_of(overloads.begin(), overloads.end(), [&](const Function* ovl) { + if (overloads.size() > 1 && std::any_of(overloads.begin(), overloads.end(), [&](const Function* ovl) -> bool { if (&func == ovl) return false; if (!ovl->functionScope) @@ -2432,7 +2432,7 @@ bool CheckClass::checkConstFunc(const Scope *scope, const Function *func, Member return nullptr; }; - auto checkFuncCall = [this, &memberAccessed](const Token* funcTok, const Scope* scope, const Function* func) { + auto checkFuncCall = [this, &memberAccessed](const Token* funcTok, const Scope* scope, const Function* func) -> bool { if (isMemberFunc(scope, funcTok) && (funcTok->strAt(-1) != "." || Token::simpleMatch(funcTok->tokAt(-2), "this ."))) { const bool isSelf = func == funcTok->function(); if (!isConstMemberFunc(scope, funcTok) && !isSelf) @@ -2563,7 +2563,7 @@ bool CheckClass::checkConstFunc(const Scope *scope, const Function *func, Member if (assignVar->isPointer() && !assignVar->isConst() && var->typeScope()) { const auto& funcMap = var->typeScope()->functionMap; // if there is no operator that is const and returns a non-const pointer, func cannot be const - if (std::none_of(funcMap.cbegin(), funcMap.cend(), [](const std::pair& fm) { + if (std::none_of(funcMap.cbegin(), funcMap.cend(), [](const std::pair& fm) -> bool { return fm.second->isConst() && fm.first == "operator[]" && !Function::returnsConst(fm.second); })) return false; @@ -2583,7 +2583,7 @@ bool CheckClass::checkConstFunc(const Scope *scope, const Function *func, Member if (!end || !scope || !Token::simpleMatch(end->astParent(), ".")) return false; const std::string op = "operator" + end->astParent()->originalName(); - auto it = std::find_if(scope->functionList.begin(), scope->functionList.end(), [&op](const Function& f) { + auto it = std::find_if(scope->functionList.begin(), scope->functionList.end(), [&op](const Function& f) -> bool { return f.isConst() && f.name() == op; }); if (it == scope->functionList.end() || !it->retType || !it->retType->classScope) @@ -2995,7 +2995,7 @@ void CheckClass::virtualFunctionCallInConstructorError( const char * scopeFunctionTypeName = scopeFunction ? getFunctionTypeName(scopeFunction->type) : "constructor"; ErrorPath errorPath; - std::transform(tokStack.cbegin(), tokStack.cend(), std::back_inserter(errorPath), [](const Token* tok) { + std::transform(tokStack.cbegin(), tokStack.cend(), std::back_inserter(errorPath), [](const Token* tok) -> ErrorPathItem { return ErrorPathItem(tok, "Calling " + tok->str()); }); int lineNumber = 1; @@ -3030,7 +3030,7 @@ void CheckClass::pureVirtualFunctionCallInConstructorError( const char * scopeFunctionTypeName = scopeFunction ? getFunctionTypeName(scopeFunction->type) : "constructor"; ErrorPath errorPath; - std::transform(tokStack.cbegin(), tokStack.cend(), std::back_inserter(errorPath), [](const Token* tok) { + std::transform(tokStack.cbegin(), tokStack.cend(), std::back_inserter(errorPath), [](const Token* tok) -> ErrorPathItem { return ErrorPathItem(tok, "Calling " + tok->str()); }); if (!errorPath.empty()) @@ -3193,7 +3193,7 @@ void CheckClass::checkCopyCtorAndEqOperator() for (const Scope * scope : mSymbolDatabase->classAndStructScopes) { - const bool hasNonStaticVars = std::any_of(scope->varlist.begin(), scope->varlist.end(), [](const Variable& var) { + const bool hasNonStaticVars = std::any_of(scope->varlist.begin(), scope->varlist.end(), [](const Variable& var) -> bool { return !var.isStatic(); }); if (!hasNonStaticVars) @@ -3366,7 +3366,7 @@ void CheckClass::checkUselessOverride() const Function* baseFunc = func.getOverriddenFunction(); if (!baseFunc || baseFunc->isPure() || baseFunc->access != func.access) continue; - if (std::any_of(classScope->functionList.begin(), classScope->functionList.end(), [&func](const Function& f) { // check for overloads + if (std::any_of(classScope->functionList.begin(), classScope->functionList.end(), [&func](const Function& f) -> bool { // check for overloads if (&f == &func) return false; return f.name() == func.name(); @@ -3398,7 +3398,7 @@ void CheckClass::checkUselessOverride() continue; std::vector callArgs = getArguments(call); if (func.argumentList.size() != callArgs.size() || - !std::equal(func.argumentList.begin(), func.argumentList.end(), callArgs.begin(), [](const Variable& v, const Token* t) { + !std::equal(func.argumentList.begin(), func.argumentList.end(), callArgs.begin(), [](const Variable& v, const Token* t) -> bool { return v.nameToken() && v.nameToken()->str() == t->str(); })) continue; @@ -3677,7 +3677,7 @@ Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Setti // the full definition must be compared const bool fullDefinition = std::all_of(classScope->functionList.cbegin(), classScope->functionList.cend(), - [](const Function& f) { + [](const Function& f) -> bool { return f.hasBody(); }); if (!fullDefinition) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index b5316dbee00..3547a2d2e88 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -668,7 +668,7 @@ void CheckCondition::multiCondition2() bool nonlocal = false; // nonlocal variable used in condition std::set vars; // variables used in condition visitAstNodes(condTok, - [&](const Token *cond) { + [&](const Token *cond) -> ChildrenToVisit { if (Token::Match(cond, "%name% (")) { functionCall = true; nonConstFunctionCall = isNonConstFunctionCall(cond, mSettings->library); @@ -700,7 +700,7 @@ void CheckCondition::multiCondition2() std::vector varsInCond; visitAstNodes(condTok, - [&varsInCond](const Token *cond) { + [&varsInCond](const Token *cond) -> ChildrenToVisit { if (cond->variable()) { const Variable *var = cond->variable(); if (std::find(varsInCond.cbegin(), varsInCond.cend(), var) == varsInCond.cend()) @@ -744,7 +744,7 @@ void CheckCondition::multiCondition2() ErrorPath errorPath; if (type == MULTICONDITIONTYPE::INNER) { - visitAstNodes(cond1, [&](const Token* firstCondition) { + visitAstNodes(cond1, [&](const Token* firstCondition) -> ChildrenToVisit { if (!firstCondition) return ChildrenToVisit::none; if (firstCondition->str() == "&&") { @@ -762,7 +762,7 @@ void CheckCondition::multiCondition2() return ChildrenToVisit::none; }); } else { - visitAstNodes(cond2, [&](const Token *secondCondition) { + visitAstNodes(cond2, [&](const Token *secondCondition) -> ChildrenToVisit { if (secondCondition->str() == "||" || secondCondition->str() == "&&") return ChildrenToVisit::op1_and_op2; @@ -806,7 +806,7 @@ void CheckCondition::multiCondition2() // Incomplete code break; } - const bool changed = std::any_of(vars.cbegin(), vars.cend(), [&](int varid) { + const bool changed = std::any_of(vars.cbegin(), vars.cend(), [&](int varid) -> bool { return isVariableChanged(tok1, tok2, varid, nonlocal, *mSettings); }); if (changed) @@ -949,7 +949,7 @@ static int sign(const T v) { // returns 1 (-1) if the first (second) condition is sufficient, 0 if indeterminate template static int sufficientCondition(std::string op1, const bool not1, const T value1, std::string op2, const bool not2, const T value2, const bool isAnd) { - auto transformOp = [](std::string& op, const bool invert) { + auto transformOp = [](std::string& op, const bool invert) -> void { if (invert) { if (op == "==") op = "!="; @@ -1587,7 +1587,7 @@ void CheckCondition::alwaysTrueFalse() true, true)) continue; - if (isConstVarExpression(tok, [](const Token* tok) { + if (isConstVarExpression(tok, [](const Token* tok) -> bool { return Token::Match(tok, "[|(|&|+|-|*|/|%|^|>>|<<") && !Token::simpleMatch(tok, "( )"); })) continue; @@ -1604,7 +1604,7 @@ void CheckCondition::alwaysTrueFalse() // Don't warn when there are expanded macros.. bool isExpandedMacro = false; - visitAstNodes(tok, [&](const Token * tok2) { + visitAstNodes(tok, [&](const Token * tok2) -> ChildrenToVisit { if (!tok2) return ChildrenToVisit::none; if (tok2->isExpandedMacro()) { @@ -1626,7 +1626,7 @@ void CheckCondition::alwaysTrueFalse() // don't warn when condition checks sizeof result bool hasSizeof = false; - visitAstNodes(tok, [&](const Token * tok2) { + visitAstNodes(tok, [&](const Token * tok2) -> ChildrenToVisit { if (!tok2) return ChildrenToVisit::none; if (tok2->isNumber()) diff --git a/lib/checkersreport.cpp b/lib/checkersreport.cpp index 3d9cb7c654f..6e21eb07c88 100644 --- a/lib/checkersreport.cpp +++ b/lib/checkersreport.cpp @@ -43,7 +43,7 @@ static int getMisraCVersion(const Settings& settings) { return 2012; if (settings.addons.count("misra")) return 2012; - const bool misraAddonInfo = std::any_of(settings.addonInfos.cbegin(), settings.addonInfos.cend(), [](const AddonInfo& addonInfo) { + const bool misraAddonInfo = std::any_of(settings.addonInfos.cbegin(), settings.addonInfos.cend(), [](const AddonInfo& addonInfo) -> bool { return addonInfo.name == "misra"; }); if (misraAddonInfo) @@ -197,7 +197,7 @@ std::string CheckersReport::getReport(const std::string& criticalErrors) const const Settings& settings, const std::set& activeCheckers, const std::map& premiumCheckers, - const std::string& substring) { + const std::string& substring) -> void { fout << std::endl << std::endl; fout << title << std::endl; fout << std::string(title.size(), '-') << std::endl; diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 17f5629b009..9303be9fe16 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -64,11 +64,11 @@ static bool isAutoDeallocType(const Type* type) { if (type->classScope->numConstructors > 0) return true; const std::list& varlist = type->classScope->varlist; - if (std::any_of(varlist.begin(), varlist.end(), [](const Variable& v) { + if (std::any_of(varlist.begin(), varlist.end(), [](const Variable& v) -> bool { return !v.valueType() || (!v.valueType()->isPrimitive() && !v.valueType()->container); })) return true; - if (std::none_of(type->derivedFrom.cbegin(), type->derivedFrom.cend(), [](const Type::BaseInfo& bi) { + if (std::none_of(type->derivedFrom.cbegin(), type->derivedFrom.cend(), [](const Type::BaseInfo& bi) -> bool { return isAutoDeallocType(bi.type); })) return false; @@ -368,8 +368,8 @@ bool CheckLeakAutoVar::checkScope(const Token * const startToken, using Direction = ArgumentChecks::Direction; const std::vector args = getArguments(ftok); const std::map &argChecks = libFunc->argumentChecks; - bool hasOutParam = std::any_of(argChecks.cbegin(), argChecks.cend(), [](const std::pair &pair) { - return std::any_of(pair.second.direction.cbegin(), pair.second.direction.cend(), [](const Direction dir) { + bool hasOutParam = std::any_of(argChecks.cbegin(), argChecks.cend(), [](const std::pair &pair) -> bool { + return std::any_of(pair.second.direction.cbegin(), pair.second.direction.cend(), [](const Direction dir) -> bool { return dir == Direction::DIR_OUT; }); }); @@ -378,7 +378,7 @@ bool CheckLeakAutoVar::checkScope(const Token * const startToken, if (!argChecks.count(i + 1)) continue; const ArgumentChecks argCheck = argChecks.at(i + 1); - const bool isInParam = std::any_of(argCheck.direction.cbegin(), argCheck.direction.cend(), [&](const Direction dir) { + const bool isInParam = std::any_of(argCheck.direction.cbegin(), argCheck.direction.cend(), [&](const Direction dir) -> bool { return dir == Direction::DIR_IN; }); if (!isInParam) @@ -568,7 +568,7 @@ bool CheckLeakAutoVar::checkScope(const Token * const startToken, astOperand2AfterCommas = astOperand2AfterCommas->astOperand2(); // Recursively scan variable comparisons in condition - visitAstNodes(astOperand2AfterCommas, [&](const Token *tok3) { + visitAstNodes(astOperand2AfterCommas, [&](const Token *tok3) -> ChildrenToVisit { if (!tok3) return ChildrenToVisit::none; if (tok3->str() == "&&" || tok3->str() == "||") { @@ -601,7 +601,7 @@ bool CheckLeakAutoVar::checkScope(const Token * const startToken, (notzero.find(vartok->varId()) != notzero.end())) varInfo2.clear(); - if (std::any_of(varInfo1.alloctype.begin(), varInfo1.alloctype.end(), [&](const std::pair& info) { + if (std::any_of(varInfo1.alloctype.begin(), varInfo1.alloctype.end(), [&](const std::pair& info) -> bool { if (info.second.status != VarInfo::ALLOC) return false; const Token* ret = getReturnValueFromOutparamAlloc(info.second.allocTok, *mSettings); diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 7a06f66f644..256f842323f 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -626,7 +626,7 @@ void CheckOther::checkRedundantAssignment() isInitialization = true; bool trivial = true; visitAstNodes(tok->astOperand2(), - [&](const Token *rhs) { + [&](const Token *rhs) -> ChildrenToVisit { if (Token::simpleMatch(rhs, "{ 0 }")) return ChildrenToVisit::none; if (Token::Match(rhs, "%str%|%num%|%name%") && !rhs->varId()) @@ -1371,7 +1371,7 @@ bool CheckOther::checkInnerScope(const Token *tok, const Variable* var, bool& us std::pair range = tok->next()->findExpressionStartEndTokens(); if (range.first) range.first = range.first->next(); - const Token* exprTok = findExpression(var->nameToken()->exprId(), range.first, range.second, [&](const Token* tok2) { + const Token* exprTok = findExpression(var->nameToken()->exprId(), range.first, range.second, [&](const Token* tok2) -> bool { return tok2->varId() == var->declarationId(); }); if (exprTok) { @@ -1420,7 +1420,7 @@ bool CheckOther::checkInnerScope(const Token *tok, const Variable* var, bool& us if (ftok->function()) { const std::list &argvars = ftok->function()->argumentList; if (const Variable* argvar = ftok->function()->getArgumentVar(argn)) { - if (!std::all_of(argvars.cbegin(), argvars.cend(), [&](const Variable& other) { + if (!std::all_of(argvars.cbegin(), argvars.cend(), [&](const Variable& other) -> bool { return &other == argvar || !mayDependOn(other.valueType(), argvar->valueType()); })) return false; @@ -1700,7 +1700,7 @@ void CheckOther::checkConstVariable() } if (function && (Function::returnsReference(function) || Function::returnsPointer(function)) && !Function::returnsConst(function)) { std::vector returns = Function::findReturns(function); - if (std::any_of(returns.cbegin(), returns.cend(), [&](const Token* retTok) { + if (std::any_of(returns.cbegin(), returns.cend(), [&](const Token* retTok) -> bool { if (retTok->varId() == var->declarationId()) return true; while (retTok && retTok->isCast()) @@ -2279,7 +2279,7 @@ void CheckOther::checkIncompleteStatement() // dostuff() || x=213; if (Token::Match(tok, "%oror%|&&")) { bool warn = false; - visitAstNodes(tok, [&warn](const Token *child) { + visitAstNodes(tok, [&warn](const Token *child) -> ChildrenToVisit { if (Token::Match(child, "%oror%|&&")) return ChildrenToVisit::op1_and_op2; if (child->isAssignmentOp()) @@ -2872,7 +2872,7 @@ void CheckOther::checkDuplicateExpression() } } } - auto isInsideLambdaCaptureList = [](const Token* tok) { + auto isInsideLambdaCaptureList = [](const Token* tok) -> const Token* { const Token* parent = tok->astParent(); while (Token::simpleMatch(parent, ",")) parent = parent->astParent(); @@ -2945,7 +2945,7 @@ void CheckOther::checkDuplicateExpression() isWithoutSideEffects(tok->astOperand2())) duplicateExpressionError(tok->astOperand2(), tok->astOperand1()->astOperand2(), tok, std::move(errorPath)); else if (tok->astOperand2() && isConstExpression(tok->astOperand1(), mSettings->library)) { - auto checkDuplicate = [&](const Token* exp1, const Token* exp2, const Token* ast1) { + auto checkDuplicate = [&](const Token* exp1, const Token* exp2, const Token* ast1) -> void { if (isSameExpression(true, exp1, exp2, *mSettings, true, true, &errorPath) && isWithoutSideEffects(exp1) && isWithoutSideEffects(ast1->astOperand2())) @@ -3213,7 +3213,7 @@ void CheckOther::pointerPositiveError(const Token *tok, const ValueFlow::Value * /* check if a constructor in given class scope takes a reference */ static bool constructorTakesReference(const Scope * const classScope) { - return std::any_of(classScope->functionList.begin(), classScope->functionList.end(), [&](const Function& constructor) { + return std::any_of(classScope->functionList.begin(), classScope->functionList.end(), [&](const Function& constructor) -> bool { if (constructor.isConstructor()) { for (int argnr = 0U; argnr < constructor.argCount(); argnr++) { const Variable * const argVar = constructor.getArgumentVar(argnr); @@ -3673,7 +3673,7 @@ static bool checkEvaluationOrderC(const Token * tok, const Token * tok2, const T } // Is expression used? bool foundError = false; - visitAstNodes((parent->astOperand1() != tok2) ? parent->astOperand1() : parent->astOperand2(), [&](const Token *tok3) { + visitAstNodes((parent->astOperand1() != tok2) ? parent->astOperand1() : parent->astOperand2(), [&](const Token *tok3) -> ChildrenToVisit { if (tok3->str() == "&" && !tok3->astOperand2()) return ChildrenToVisit::none; // don't handle address-of for now if (tok3->str() == "(" && Token::simpleMatch(tok3->previous(), "sizeof")) @@ -3695,7 +3695,7 @@ static bool checkEvaluationOrderCpp11(const Token * tok, const Token * tok2, con return true; } bool foundUndefined{false}; - visitAstNodes((parent->astOperand1() != tok2) ? parent->astOperand1() : parent->astOperand2(), [&](const Token *tok3) { + visitAstNodes((parent->astOperand1() != tok2) ? parent->astOperand1() : parent->astOperand2(), [&](const Token *tok3) -> ChildrenToVisit { if (tok3->str() == "&" && !tok3->astOperand2()) return ChildrenToVisit::none; // don't handle address-of for now if (tok3->str() == "(" && Token::simpleMatch(tok3->previous(), "sizeof")) @@ -3713,7 +3713,7 @@ static bool checkEvaluationOrderCpp17(const Token * tok, const Token * tok2, con if (tok->isAssignmentOp()) return false; bool foundUndefined{false}; - visitAstNodes((parent->astOperand1() != tok2) ? parent->astOperand1() : parent->astOperand2(), [&](const Token *tok3) { + visitAstNodes((parent->astOperand1() != tok2) ? parent->astOperand1() : parent->astOperand2(), [&](const Token *tok3) -> ChildrenToVisit { if (tok3->str() == "&" && !tok3->astOperand2()) return ChildrenToVisit::none; // don't handle address-of for now if (tok3->str() == "(" && Token::simpleMatch(tok3->previous(), "sizeof")) @@ -4008,7 +4008,7 @@ static const Token *findShadowed(const Scope *scope, const Variable& var, int li if (v.name() == var.name()) return v.nameToken(); } - auto it = std::find_if(scope->functionList.cbegin(), scope->functionList.cend(), [&](const Function& f) { + auto it = std::find_if(scope->functionList.cbegin(), scope->functionList.cend(), [&](const Function& f) -> bool { return f.type == FunctionType::eFunction && f.name() == var.name() && precedes(f.tokenDef, var.nameToken()); }); if (it != scope->functionList.end()) @@ -4040,7 +4040,7 @@ void CheckOther::checkShadowVariables() if (functionScope && functionScope->type == ScopeType::eFunction && functionScope->function) { const auto & argList = functionScope->function->argumentList; - auto it = std::find_if(argList.cbegin(), argList.cend(), [&](const Variable& arg) { + auto it = std::find_if(argList.cbegin(), argList.cend(), [&](const Variable& arg) -> bool { return arg.nameToken() && var.name() == arg.name(); }); if (it != argList.end()) { @@ -4145,7 +4145,7 @@ void CheckOther::checkKnownArgument() continue; // ensure that there is a integer variable in expression with unknown value const Token* vartok = nullptr; - visitAstNodes(tok, [&](const Token* child) { + visitAstNodes(tok, [&](const Token* child) -> ChildrenToVisit { if (Token::Match(child, "%var%|.|[")) { if (child->hasKnownIntValue()) return ChildrenToVisit::none; @@ -4159,7 +4159,7 @@ void CheckOther::checkKnownArgument() if (!vartok) continue; if (vartok->astSibling() && - findAstNode(vartok->astSibling(), [](const Token* child) { + findAstNode(vartok->astSibling(), [](const Token* child) -> bool { return Token::simpleMatch(child, "sizeof"); })) continue; @@ -4223,7 +4223,7 @@ void CheckOther::checkKnownPointerToBool() continue; if (tok->isExpandedMacro()) continue; - if (findParent(tok, [](const Token* parent) { + if (findParent(tok, [](const Token* parent) -> bool { return parent->isExpandedMacro(); })) continue; @@ -4417,7 +4417,7 @@ void CheckOther::checkOverlappingWrite() // Is other union member used in RHS? const Token *errorToken = nullptr; - visitAstNodes(tok->astOperand2(), [lhsvar, lhsmember, &errorToken](const Token *rhs) { + visitAstNodes(tok->astOperand2(), [lhsvar, lhsmember, &errorToken](const Token *rhs) -> ChildrenToVisit { if (!Token::simpleMatch(rhs, ".")) return ChildrenToVisit::op1_and_op2; if (!rhs->isBinaryOp() || rhs->astOperand1()->variable() != lhsvar) diff --git a/lib/checksizeof.cpp b/lib/checksizeof.cpp index 15a1caf1a8e..00382c47a18 100644 --- a/lib/checksizeof.cpp +++ b/lib/checksizeof.cpp @@ -178,7 +178,7 @@ void CheckSizeof::checkSizeofForPointerSize() while (parTok) { // Allow division if followed by multiplication if (parTok->isArithmeticalOp() && parTok->str() == "*") { const Token* szToks[] = { parTok->astOperand1(), parTok->astOperand2() }; - if (std::any_of(std::begin(szToks), std::end(szToks), [](const Token* szTok) { + if (std::any_of(std::begin(szToks), std::end(szToks), [](const Token* szTok) -> bool { return Token::simpleMatch(szTok, "(") && Token::simpleMatch(szTok->previous(), "sizeof"); })) return true; diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index a88591a904a..64f635b7297 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -180,7 +180,7 @@ void CheckStl::outOfBounds() } if (indexTok && !indexTok->hasKnownIntValue()) { const ValueFlow::Value* value = - ValueFlow::findValue(indexTok->values(), *mSettings, [&](const ValueFlow::Value& v) { + ValueFlow::findValue(indexTok->values(), *mSettings, [&](const ValueFlow::Value& v) -> bool { if (!v.isSymbolicValue()) return false; if (v.isImpossible()) @@ -718,8 +718,8 @@ static bool isSameIteratorContainerExpression(const Token* tok1, if (kind == ValueFlow::Value::LifetimeKind::Address || kind == ValueFlow::Value::LifetimeKind::Iterator) { const auto address1 = getAddressContainer(tok1); const auto address2 = getAddressContainer(tok2); - return std::any_of(address1.begin(), address1.end(), [&](const Token* tok1) { - return std::any_of(address2.begin(), address2.end(), [&](const Token* tok2) { + return std::any_of(address1.begin(), address1.end(), [&](const Token* tok1) -> bool { + return std::any_of(address2.begin(), address2.end(), [&](const Token* tok2) -> bool { return isSameExpression(false, tok1, tok2, settings, false, false); }); }); @@ -736,11 +736,11 @@ static std::vector pruneLifetimes(std::vectortokvalue; - auto it = std::partition(start, lifetimes.end(), [&](const ValueFlow::Value& v) { + auto it = std::partition(start, lifetimes.end(), [&](const ValueFlow::Value& v) -> bool { const Token* tok2 = v.tokvalue; return start->lifetimeKind == v.lifetimeKind && (astHasToken(tok1, tok2) || astHasToken(tok2, tok1)); }); - auto root = std::min_element(start, it, [](const ValueFlow::Value& x, const ValueFlow::Value& y) { + auto root = std::min_element(start, it, [](const ValueFlow::Value& x, const ValueFlow::Value& y) -> bool { return x.tokvalue != y.tokvalue && astHasToken(x.tokvalue, y.tokvalue); }); result.push_back(*root); @@ -751,8 +751,8 @@ static std::vector pruneLifetimes(std::vector& values, const std::vector::const_iterator beg) { - return std::find_if(beg, values.cend(), [](const ValueFlow::Value& v) { + auto findIterVal = [](const std::vector& values, const std::vector::const_iterator beg) -> std::vector::const_iterator { + return std::find_if(beg, values.cend(), [](const ValueFlow::Value& v) -> bool { return v.lifetimeKind == ValueFlow::Value::LifetimeKind::Iterator; }); }; @@ -851,7 +851,7 @@ void CheckStl::mismatchingContainers() } // Lambda is used to escape the nested loops - [&] { + [&]() -> void { for (const auto& p : containers) { const std::vector& cargs = p.second; @@ -1012,7 +1012,7 @@ namespace { auto it = invalidMethods.find(f); if (it != invalidMethods.end()) { std::vector refs = it->second.invalidTokens(); - std::copy_if(refs.cbegin(), refs.cend(), std::back_inserter(result), [&](const Info::Reference& r) { + std::copy_if(refs.cbegin(), refs.cend(), std::back_inserter(result), [&](const Info::Reference& r) -> bool { const Variable* var = r.tok->variable(); if (!var) return false; @@ -1188,7 +1188,7 @@ void CheckStl::invalidContainer() const ValueFlow::Value* v = nullptr; ErrorPath errorPath; PathAnalysis::Info info = - PathAnalysis{endToken}.forwardFind([&](const PathAnalysis::Info& info) { + PathAnalysis{endToken}.forwardFind([&](const PathAnalysis::Info& info) -> bool { if (!info.tok->variable()) return false; if (info.tok->varId() == 0) @@ -1252,7 +1252,7 @@ void CheckStl::invalidContainerLoopError(const Token* tok, const Token* loopTok, errorPath.emplace_back(loopTok, "Iterating container here."); // Remove duplicate entries from error path - errorPath.remove_if([&](const ErrorPathItem& epi) { + errorPath.remove_if([&](const ErrorPathItem& epi) -> bool { return epi.first == tok; }); @@ -1307,7 +1307,7 @@ void CheckStl::stlOutOfBounds() std::vector conds; visitAstNodes(condition, - [&](const Token *cond) { + [&](const Token *cond) -> ChildrenToVisit { if (Token::Match(cond, "%oror%|&&")) return ChildrenToVisit::op1_and_op2; if (cond->isComparisonOp()) @@ -2451,7 +2451,7 @@ void CheckStl::checkDereferenceInvalidIterator2() continue; std::vector contValues; - std::copy_if(tok->values().cbegin(), tok->values().cend(), std::back_inserter(contValues), [&](const ValueFlow::Value& value) { + std::copy_if(tok->values().cbegin(), tok->values().cend(), std::back_inserter(contValues), [&](const ValueFlow::Value& value) -> bool { if (value.isImpossible()) return false; if (!printInconclusive && value.isInconclusive()) @@ -2475,7 +2475,7 @@ void CheckStl::checkDereferenceInvalidIterator2() } else if (value.isIteratorStartValue() && value.intvalue < 0) { isInvalidIterator = true; } else { - auto it = std::find_if(contValues.cbegin(), contValues.cend(), [&](const ValueFlow::Value& c) { + auto it = std::find_if(contValues.cbegin(), contValues.cend(), [&](const ValueFlow::Value& c) -> bool { if (value.path != c.path) return false; if (value.isIteratorStartValue() && value.intvalue >= c.intvalue) @@ -2882,7 +2882,7 @@ namespace { bool hasGotoOrBreak() const { - return findToken([](const Token* tok) { + return findToken([](const Token* tok) -> bool { return Token::Match(tok, "goto|break"); }); } @@ -2901,10 +2901,10 @@ namespace { return ""; bool alwaysTrue = true; bool alwaysFalse = true; - auto hasReturn = [](const Token* tok) { + auto hasReturn = [](const Token* tok) -> bool { return Token::simpleMatch(tok, "return"); }; - findTokens(hasReturn, [&](const Token* tok) { + findTokens(hasReturn, [&](const Token* tok) -> void { const Token* returnTok = tok->astOperand1(); if (!returnTok || !returnTok->hasKnownIntValue() || !astIsBool(returnTok)) { alwaysTrue = false; @@ -2964,7 +2964,7 @@ void CheckStl::useStlAlgorithm() logChecker("CheckStl::useStlAlgorithm"); // style - auto checkAssignee = [](const Token* tok) { + auto checkAssignee = [](const Token* tok) -> bool { if (astIsBool(tok)) // std::accumulate is not a good fit for bool values, std::all/any/none_of return early return false; return !astIsContainer(tok); // don't warn for containers, where overloaded operators can be costly @@ -2987,7 +2987,7 @@ void CheckStl::useStlAlgorithm() return false; }; - auto isAccumulation = [](const Token* tok, int varId) { + auto isAccumulation = [](const Token* tok, int varId) -> bool { if (tok->str() != "=") return true; const Token* end = Token::findmatch(tok, "%varid%|;", varId); // TODO: lambdas? @@ -3213,7 +3213,7 @@ static bool isKnownEmptyContainer(const Token* tok) { if (!tok) return false; - return std::any_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& v) { + return std::any_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& v) -> bool { if (!v.isKnown()) return false; if (!v.isContainerSizeValue()) @@ -3296,7 +3296,7 @@ void CheckStl::eraseIteratorOutOfBoundsError(const Token *ftok, const Token* ite static const ValueFlow::Value* getOOBIterValue(const Token* tok, const ValueFlow::Value* sizeVal) { - auto it = std::find_if(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& v) { + auto it = std::find_if(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& v) -> bool { if (v.isPossible() || v.isKnown()) { switch (v.valueType) { case ValueFlow::Value::ValueType::ITERATOR_END: diff --git a/lib/checkstring.cpp b/lib/checkstring.cpp index c6d4cb88cab..1f45c3d224b 100644 --- a/lib/checkstring.cpp +++ b/lib/checkstring.cpp @@ -359,7 +359,7 @@ void CheckString::overlappingStrcmp() continue; std::list equals0; std::list notEquals0; - visitAstNodes(tok, [&](const Token * t) { + visitAstNodes(tok, [&](const Token * t) -> ChildrenToVisit { if (!t) return ChildrenToVisit::none; if (t->str() == "||") { diff --git a/lib/checktype.cpp b/lib/checktype.cpp index aa72013b7ed..fb86b2c3df0 100644 --- a/lib/checktype.cpp +++ b/lib/checktype.cpp @@ -268,7 +268,7 @@ void CheckType::checkSignConversion() if (!tok1) continue; const ValueFlow::Value* negativeValue = - ValueFlow::findValue(tok1->values(), *mSettings, [&](const ValueFlow::Value& v) { + ValueFlow::findValue(tok1->values(), *mSettings, [&](const ValueFlow::Value& v) -> bool { return !v.isImpossible() && v.isIntValue() && (v.intvalue <= -1 || v.wideintvalue <= -1); }); if (!negativeValue) @@ -331,7 +331,7 @@ static bool checkTypeCombination(ValueType src, ValueType tgt, const Settings& s if (!(sizeSrc > 0 && sizeTgt > 0 && sizeSrc < sizeTgt)) return false; - return std::any_of(std::begin(typeCombinations), std::end(typeCombinations), [&](const std::pair& p) { + return std::any_of(std::begin(typeCombinations), std::end(typeCombinations), [&](const std::pair& p) -> bool { return src.type == p.first && tgt.type == p.second; }); } diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index d0217f9c075..5ca40a27a2c 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -594,7 +594,7 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var const Token *errorToken = nullptr; visitAstNodes(tok->next(), - [&](const Token *child) { + [&](const Token *child) -> ChildrenToVisit { if (child->isUnaryOp("&")) return ChildrenToVisit::none; if (child->str() == "," || child->str() == "{" || child->isConstOp()) @@ -725,7 +725,7 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var if (!suppressErrors && Token::Match(tok, "%name% . %name%") && tok->strAt(2) == membervar && Token::Match(tok->next()->astParent(), "%cop%|return|throw|?")) uninitStructMemberError(tok, tok->str() + "." + membervar); else if (tok->isCpp() && !suppressErrors && Token::Match(tok, "%name%") && Token::Match(tok->astParent(), "return|throw|?")) { - if (std::any_of(tok->values().cbegin(), tok->values().cend(), [](const ValueFlow::Value& v) { + if (std::any_of(tok->values().cbegin(), tok->values().cend(), [](const ValueFlow::Value& v) -> bool { return v.isUninitValue() && !v.isInconclusive(); })) uninitStructMemberError(tok, tok->str() + "." + membervar); @@ -1061,7 +1061,7 @@ const Token* CheckUninitVar::checkLoopBodyRecursive(const Token *start, const Va errorToken = errtok; } else if (tok->strAt(1) == "=") { bool varIsUsedInRhs = false; - visitAstNodes(tok->next()->astOperand2(), [&](const Token * t) { + visitAstNodes(tok->next()->astOperand2(), [&](const Token * t) -> ChildrenToVisit { if (!t) return ChildrenToVisit::none; if (t->varId() == var.declarationId()) { diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 29b50d5d1cf..d833f82c7eb 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -777,7 +777,7 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const tok = scope->classDef->next(); for (; tok && tok != scope->bodyEnd; tok = tok->next()) { if (tok->str() == "{" && tok != scope->bodyStart && !tok->previous()->varId()) { - if (std::any_of(scope->nestedList.cbegin(), scope->nestedList.cend(), [&](const Scope* s) { + if (std::any_of(scope->nestedList.cbegin(), scope->nestedList.cend(), [&](const Scope* s) -> bool { return s->bodyStart == tok; })) { checkFunctionVariableUsage_iterateScopes(tok->scope(), variables); // Scan child scope @@ -1155,7 +1155,7 @@ static bool isReturnedByRef(const Variable* var, const Function* func) if (!func || !Function::returnsReference(func, true)) return false; const std::vector returns = Function::findReturns(func); - return std::any_of(returns.begin(), returns.end(), [var](const Token* tok) { + return std::any_of(returns.begin(), returns.end(), [var](const Token* tok) -> bool { return tok->varId() == var->declarationId(); }); } @@ -1170,7 +1170,7 @@ void CheckUnusedVar::checkFunctionVariableUsage() // Parse all executing scopes.. const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); - auto reportLibraryCfgError = [this](const Token* tok, const std::string& typeName) { + auto reportLibraryCfgError = [this](const Token* tok, const std::string& typeName) -> void { if (mSettings->checkLibrary) { reportError(tok, Severity::information, @@ -1524,9 +1524,9 @@ void CheckUnusedVar::checkStructMemberUsage() continue; // bail out if struct is inherited - const bool isInherited = std::any_of(symbolDatabase->scopeList.cbegin(), symbolDatabase->scopeList.cend(), [&](const Scope& derivedScope) { + const bool isInherited = std::any_of(symbolDatabase->scopeList.cbegin(), symbolDatabase->scopeList.cend(), [&](const Scope& derivedScope) -> bool { const Type* dType = derivedScope.definedType; - return dType && std::any_of(dType->derivedFrom.cbegin(), dType->derivedFrom.cend(), [&](const Type::BaseInfo& derivedFrom) { + return dType && std::any_of(dType->derivedFrom.cbegin(), dType->derivedFrom.cend(), [&](const Type::BaseInfo& derivedFrom) -> bool { return derivedFrom.type == scope.definedType && derivedFrom.access != AccessControl::Private; }); }); @@ -1711,7 +1711,7 @@ bool CheckUnusedVar::isRecordTypeWithoutSideEffects(const Type* type) } // Derived from type that has side effects? - if (std::any_of(type->derivedFrom.cbegin(), type->derivedFrom.cend(), [this](const Type::BaseInfo& derivedFrom) { + if (std::any_of(type->derivedFrom.cbegin(), type->derivedFrom.cend(), [this](const Type::BaseInfo& derivedFrom) -> bool { return !isRecordTypeWithoutSideEffects(derivedFrom.type); })) return (withoutSideEffects = false); @@ -1757,7 +1757,7 @@ bool CheckUnusedVar::isEmptyType(const Type* type) if (type && type->classScope && type->classScope->numConstructors == 0 && (type->classScope->varlist.empty())) { - return (emptyType = std::all_of(type->derivedFrom.cbegin(), type->derivedFrom.cend(), [this](const Type::BaseInfo& bi) { + return (emptyType = std::all_of(type->derivedFrom.cbegin(), type->derivedFrom.cend(), [this](const Type::BaseInfo& bi) -> bool { return isEmptyType(bi.type); })); } diff --git a/lib/clangimport.cpp b/lib/clangimport.cpp index 8a9a564dd24..d3acc945bed 100644 --- a/lib/clangimport.cpp +++ b/lib/clangimport.cpp @@ -910,7 +910,7 @@ Token *clangimport::AstNode::createTokens(TokenList &tokenList) Token *expr1 = varDecl->createTokens(tokenList); Token *colon = addtoken(tokenList, ":"); - auto it = std::find_if(children.cbegin(), children.cbegin() + 2, [&](const AstNodePtr& c) { + auto it = std::find_if(children.cbegin(), children.cbegin() + 2, [&](const AstNodePtr& c) -> bool { return c && c->nodeType == DeclStmt && c->getChild(0)->nodeType == VarDecl; }); if (it == children.cbegin() + 2) @@ -1497,7 +1497,7 @@ void clangimport::AstNode::createTokensForCXXRecord(TokenList &tokenList) // definition if (isDefinition()) { std::vector children2; - std::copy_if(children.cbegin(), children.cend(), std::back_inserter(children2), [](const AstNodePtr& child) { + std::copy_if(children.cbegin(), children.cend(), std::back_inserter(children2), [](const AstNodePtr& child) -> bool { return child->nodeType == CXXConstructorDecl || child->nodeType == CXXDestructorDecl || child->nodeType == CXXMethodDecl || @@ -1582,7 +1582,7 @@ static void setValues(const Tokenizer &tokenizer, const SymbolDatabase *symbolDa MathLib::bigint typeSize = 0; for (const Variable &var: scope.varlist) { - const int mul = std::accumulate(var.dimensions().cbegin(), var.dimensions().cend(), 1, [](int v, const Dimension& dim) { + const int mul = std::accumulate(var.dimensions().cbegin(), var.dimensions().cend(), 1, [](int v, const Dimension& dim) -> MathLib::bigint { return v * dim.num; }); if (var.valueType()) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 86c1d5f3a41..3ec7551d969 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -713,7 +713,7 @@ unsigned int CppCheck::checkClang(const FileWithDetails &file, int fileIndex) return 0; // TODO: report as failure? } - const auto reportError = [this](const ErrorMessage& errorMessage) { + const auto reportError = [this](const ErrorMessage& errorMessage) -> void { mErrorLogger.reportErr(errorMessage); }; @@ -970,7 +970,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string simplecpp::TokenList tokens1 = createTokenList(file.spath(), files, &outputList, fileStream); // If there is a syntax error, report it and stop - const auto output_it = std::find_if(outputList.cbegin(), outputList.cend(), [](const simplecpp::Output &output){ + const auto output_it = std::find_if(outputList.cbegin(), outputList.cend(), [](const simplecpp::Output &output) -> bool { return Preprocessor::hasErrors(output); }); if (output_it != outputList.cend()) { @@ -1050,7 +1050,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string // Get configurations.. std::set configurations; if ((mSettings.checkAllConfigurations && mSettings.userDefines.empty()) || mSettings.force) { - Timer::run("Preprocessor::getConfigs", mSettings.showtime, &s_timerResults, [&]() { + Timer::run("Preprocessor::getConfigs", mSettings.showtime, &s_timerResults, [&]() -> void { configurations = preprocessor.getConfigs(tokens1); }); } else { @@ -1132,7 +1132,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string if (mSettings.preprocessOnly) { std::string codeWithoutCfg; - Timer::run("Preprocessor::getcode", mSettings.showtime, &s_timerResults, [&]() { + Timer::run("Preprocessor::getcode", mSettings.showtime, &s_timerResults, [&]() -> void { codeWithoutCfg = preprocessor.getcode(tokens1, currentConfig, files, true); }); @@ -1155,7 +1155,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string TokenList tokenlist{mSettings, file.lang()}; // Create tokens, skip rest of iteration if failed - Timer::run("Tokenizer::createTokens", mSettings.showtime, &s_timerResults, [&]() { + Timer::run("Tokenizer::createTokens", mSettings.showtime, &s_timerResults, [&]() -> void { simplecpp::TokenList tokensP = preprocessor.preprocess(tokens1, currentConfig, files, true); tokenlist.createTokens(std::move(tokensP)); }); @@ -1378,7 +1378,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation return; } - Timer::run(check->name() + "::runChecks", mSettings.showtime, &s_timerResults, [&]() { + Timer::run(check->name() + "::runChecks", mSettings.showtime, &s_timerResults, [&]() -> void { check->runChecks(tokenizer, &mErrorLogger); }); } diff --git a/lib/errorlogger.cpp b/lib/errorlogger.cpp index 183d130025a..ac9c7f1d19a 100644 --- a/lib/errorlogger.cpp +++ b/lib/errorlogger.cpp @@ -930,7 +930,7 @@ std::string getClassification(const std::string &guideline, ReportType reportTyp return ""; const auto getClassification = [](const std::vector &info, const std::string &guideline) -> std::string { - const auto it = std::find_if(info.cbegin(), info.cend(), [&](const checkers::Info &i) { + const auto it = std::find_if(info.cbegin(), info.cend(), [&](const checkers::Info &i) -> bool { return caseInsensitiveStringCompare(i.guideline, guideline) == 0; }); if (it == info.cend()) @@ -974,7 +974,7 @@ std::string getClassification(const std::string &guideline, ReportType reportTyp cppcheck::unreachable(); } - const auto it = std::find_if(info->cbegin(), info->cend(), [&](const checkers::MisraInfo &i) { + const auto it = std::find_if(info->cbegin(), info->cend(), [&](const checkers::MisraInfo &i) -> bool { return i.a == a && i.b == b; }); @@ -1006,7 +1006,7 @@ std::string getClassification(const std::string &guideline, ReportType reportTyp const int b = std::stoi(components[1]); const int c = std::stoi(components[2]); - const auto it = std::find_if(info->cbegin(), info->cend(), [&](const checkers::MisraCppInfo &i) { + const auto it = std::find_if(info->cbegin(), info->cend(), [&](const checkers::MisraCppInfo &i) -> bool { return i.a == a && i.b == b && i.c == c; }); diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index ebdfc70a50d..61de7e69ee8 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -98,7 +98,7 @@ namespace { bool stopOnCondition(const Token* condTok) const { - if (analyzer->isConditional() && findAstNode(condTok, [](const Token* tok) { + if (analyzer->isConditional() && findAstNode(condTok, [](const Token* tok) -> bool { return tok->isIncompleteVar(); })) return true; @@ -110,10 +110,10 @@ namespace { return std::make_pair(false, false); std::vector result = analyzer->evaluate(tok, ctx); // TODO: We should convert to bool - const bool checkThen = std::any_of(result.cbegin(), result.cend(), [](MathLib::bigint x) { + const bool checkThen = std::any_of(result.cbegin(), result.cend(), [](MathLib::bigint x) -> bool { return x != 0; }); - const bool checkElse = std::any_of(result.cbegin(), result.cend(), [](MathLib::bigint x) { + const bool checkElse = std::any_of(result.cbegin(), result.cend(), [](MathLib::bigint x) -> bool { return x == 0; }); return std::make_pair(checkThen, checkElse); @@ -424,7 +424,7 @@ namespace { const bool bodyChangesCond = findExpressionChanged(condTok, endBlock->link(), endBlock, settings); // Check for mutation in the condition const bool condChanged = - nullptr != findAstNode(condTok, [&](const Token* tok) { + nullptr != findAstNode(condTok, [&](const Token* tok) -> bool { return isVariableChanged(tok, 0, settings); }); const bool changed = stepChangesCond || bodyChangesCond || condChanged; @@ -437,7 +437,7 @@ namespace { Progress updateInnerLoop(Token* endBlock, Token* stepTok, Token* condTok) { loopEnds.push_back(endBlock); - OnExit oe{[&] { + OnExit oe{[&]() -> void { loopEnds.pop_back(); }}; if (endBlock && updateScope(endBlock) == Progress::Break) diff --git a/lib/fwdanalysis.cpp b/lib/fwdanalysis.cpp index 11434e5356d..47c4f1e7f5e 100644 --- a/lib/fwdanalysis.cpp +++ b/lib/fwdanalysis.cpp @@ -83,7 +83,7 @@ static bool hasVolatileCastOrVar(const Token *expr) { bool ret = false; visitAstNodes(expr, - [&ret](const Token *tok) { + [&ret](const Token *tok) -> ChildrenToVisit { if (tok->variable() && tok->variable()->isVolatile()) ret = true; else if (Token::simpleMatch(tok, "( volatile")) @@ -416,7 +416,7 @@ std::set FwdAnalysis::getExprVarIds(const Token* expr, bool* localOu bool local = true; bool unknownVarId = false; visitAstNodes(expr, - [&](const Token *tok) { + [&](const Token *tok) -> ChildrenToVisit { if (tok->str() == "[" && mWhat == What::UnusedValue) return ChildrenToVisit::op1; if (tok->varId() == 0 && tok->isName() && tok->strAt(-1) != ".") { diff --git a/lib/infer.cpp b/lib/infer.cpp index cad0761f68b..3dc6ba1de13 100644 --- a/lib/infer.cpp +++ b/lib/infer.cpp @@ -148,7 +148,7 @@ namespace { static Interval fromValues(const std::list& values) { - return Interval::fromValues(values, [](const ValueFlow::Value&) { + return Interval::fromValues(values, [](const ValueFlow::Value&) -> bool { return true; }); } @@ -228,7 +228,7 @@ namespace { if (r.empty()) return {}; bool b = calculate(op, r.front(), 0); - if (std::all_of(r.cbegin() + 1, r.cend(), [&](int i) { + if (std::all_of(r.cbegin() + 1, r.cend(), [&](int i) -> bool { return b == calculate(op, i, 0); })) return {b}; @@ -246,13 +246,13 @@ static void addToErrorPath(ValueFlow::Value& value, const std::vectorerrorPath.cbegin(), ref->errorPath.cend(), std::back_inserter(value.errorPath), - [&](const ErrorPathItem& e) { + [&](const ErrorPathItem& e) -> bool { return locations.insert(e.first).second; }); std::copy_if(ref->debugPath.cbegin(), ref->debugPath.cend(), std::back_inserter(value.debugPath), - [&](const ErrorPathItem& e) { + [&](const ErrorPathItem& e) -> bool { return locations.insert(e.first).second; }); } @@ -278,7 +278,7 @@ static void setValueKind(ValueFlow::Value& value, const std::vector& values, MathLib::bigint x) { - return std::any_of(values.cbegin(), values.cend(), [&](const ValueFlow::Value& value) { + return std::any_of(values.cbegin(), values.cend(), [&](const ValueFlow::Value& value) -> bool { return value.isImpossible() && value.intvalue == x; }); } @@ -289,7 +289,7 @@ std::vector infer(const ValuePtr& model, std::list rhsValues) { std::vector result; - auto notMatch = [&](const ValueFlow::Value& value) { + auto notMatch = [&](const ValueFlow::Value& value) -> bool { return !model->match(value); }; lhsValues.remove_if(notMatch); @@ -378,13 +378,13 @@ std::vector infer(const ValuePtr& model, std::vector getMinValue(const ValuePtr& model, const std::list& values) { - return Interval::fromValues(values, [&](const ValueFlow::Value& v) { + return Interval::fromValues(values, [&](const ValueFlow::Value& v) -> bool { return model->match(v); }).minvalue; } std::vector getMaxValue(const ValuePtr& model, const std::list& values) { - return Interval::fromValues(values, [&](const ValueFlow::Value& v) { + return Interval::fromValues(values, [&](const ValueFlow::Value& v) -> bool { return model->match(v); }).maxvalue; } diff --git a/lib/library.cpp b/lib/library.cpp index f786584bdf2..304902777fe 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -1604,7 +1604,7 @@ bool Library::formatstr_function(const Token* ftok) const int Library::formatstr_argno(const Token* ftok) const { const std::map& argumentChecksFunc = mData->mFunctions.at(getFunctionName(ftok)).argumentChecks; - auto it = std::find_if(argumentChecksFunc.cbegin(), argumentChecksFunc.cend(), [](const std::pair& a) { + auto it = std::find_if(argumentChecksFunc.cbegin(), argumentChecksFunc.cend(), [](const std::pair& a) -> bool { return a.second.formatstr; }); return it == argumentChecksFunc.cend() ? -1 : it->first - 1; @@ -1708,7 +1708,7 @@ bool Library::hasminsize(const Token *ftok) const const auto it = utils::as_const(mData->mFunctions).find(getFunctionName(ftok)); if (it == mData->mFunctions.cend()) return false; - return std::any_of(it->second.argumentChecks.cbegin(), it->second.argumentChecks.cend(), [](const std::pair& a) { + return std::any_of(it->second.argumentChecks.cbegin(), it->second.argumentChecks.cend(), [](const std::pair& a) -> bool { return !a.second.minsizes.empty(); }); } diff --git a/lib/mathlib.cpp b/lib/mathlib.cpp index 54240fa4f2f..57e10e1a41b 100644 --- a/lib/mathlib.cpp +++ b/lib/mathlib.cpp @@ -365,7 +365,7 @@ MathLib::biguint MathLib::toBigUNumber(const std::string & str, const Token * co unsigned int MathLib::encodeMultiChar(const std::string& str) { - return std::accumulate(str.cbegin(), str.cend(), uint32_t(), [](uint32_t v, char c) { + return std::accumulate(str.cbegin(), str.cend(), uint32_t(), [](uint32_t v, char c) -> uint32_t { return (v << 8) | c; }); } @@ -469,7 +469,7 @@ static double myStod(const std::string& str, std::string::const_iterator from, s return 0.; // error handling?? else distance = int(decimalsep)-(from - str.begin()); - auto digitval = [&](char c) { + auto digitval = [&](char c) -> int { if ((10 < base) && (c > '9')) return 10 + std::tolower(c) - 'a'; return c - '0'; diff --git a/lib/pathanalysis.cpp b/lib/pathanalysis.cpp index 8b2e1b61cbb..0fa5ca43f82 100644 --- a/lib/pathanalysis.cpp +++ b/lib/pathanalysis.cpp @@ -52,11 +52,11 @@ std::pair PathAnalysis::checkCond(const Token * tok, bool& known) known = true; return std::make_pair(!!v->intvalue, !v->intvalue); } - auto it = std::find_if(tok->values().cbegin(), tok->values().cend(), [](const ValueFlow::Value& v) { + auto it = std::find_if(tok->values().cbegin(), tok->values().cend(), [](const ValueFlow::Value& v) -> bool { return v.isIntValue(); }); // If all possible values are the same, then assume all paths have the same value - if (it != tok->values().cend() && std::all_of(it, tok->values().cend(), [&](const ValueFlow::Value& v) { + if (it != tok->values().cend() && std::all_of(it, tok->values().cend(), [&](const ValueFlow::Value& v) -> bool { if (v.isIntValue()) return v.intvalue == it->intvalue; return true; @@ -184,7 +184,7 @@ void PathAnalysis::forward(const std::function& f) const bool reaches(const Token * start, const Token * dest, ErrorPath* errorPath) { - PathAnalysis::Info info = PathAnalysis{start}.forwardFind([&](const PathAnalysis::Info& i) { + PathAnalysis::Info info = PathAnalysis{start}.forwardFind([&](const PathAnalysis::Info& i) -> bool { return (i.tok == dest); }); if (!info.tok) diff --git a/lib/pathanalysis.h b/lib/pathanalysis.h index 1085fec3f4b..dd3dd40ecce 100644 --- a/lib/pathanalysis.h +++ b/lib/pathanalysis.h @@ -46,7 +46,7 @@ struct PathAnalysis { Info forwardFind(std::function pred) const { Info result{}; - forward([&](const Info& info) { + forward([&](const Info& info) -> Progress { if (pred(info)) { result = info; return Progress::Break; diff --git a/lib/pathmatch.cpp b/lib/pathmatch.cpp index 19db03b87d1..4448473c6fa 100644 --- a/lib/pathmatch.cpp +++ b/lib/pathmatch.cpp @@ -32,7 +32,7 @@ PathMatch::PathMatch(std::vector patterns, std::string basepath, Sy bool PathMatch::match(const std::string &path, Filemode mode) const { - return std::any_of(mPatterns.cbegin(), mPatterns.cend(), [=] (const std::string &pattern) { + return std::any_of(mPatterns.cbegin(), mPatterns.cend(), [=] (const std::string &pattern) -> bool { return match(pattern, path, mBasepath, mode, mSyntax); }); } diff --git a/lib/preprocessor.cpp b/lib/preprocessor.cpp index f7ccc9c0dc5..1187bfdf025 100644 --- a/lib/preprocessor.cpp +++ b/lib/preprocessor.cpp @@ -143,7 +143,7 @@ static bool parseInlineSuppressionCommentToken(const simplecpp::Token *tok, std: if (!errmsg.empty()) bad.emplace_back(tok->location.file(), tok->location.line, std::move(errmsg)); - std::copy_if(suppressions.cbegin(), suppressions.cend(), std::back_inserter(inlineSuppressions), [](const SuppressionList::Suppression& s) { + std::copy_if(suppressions.cbegin(), suppressions.cend(), std::back_inserter(inlineSuppressions), [](const SuppressionList::Suppression& s) -> bool { return !s.errorId.empty(); }); } else { @@ -490,7 +490,7 @@ static bool isUndefined(const std::string &cfg, const std::set &und static bool getConfigsElseIsFalse(const std::vector &configs_if, const std::string &userDefines) { return std::any_of(configs_if.cbegin(), configs_if.cend(), - [&](const std::string &cfg) { + [&](const std::string &cfg) -> bool { return hasDefine(userDefines, cfg); }); } @@ -753,7 +753,7 @@ bool Preprocessor::hasErrors(const simplecpp::Output &output) bool Preprocessor::hasErrors(const simplecpp::OutputList &outputList) { - const auto it = std::find_if(outputList.cbegin(), outputList.cend(), [](const simplecpp::Output &output) { + const auto it = std::find_if(outputList.cbegin(), outputList.cend(), [](const simplecpp::Output &output) -> bool { return hasErrors(output); }); return it != outputList.cend(); @@ -764,7 +764,7 @@ void Preprocessor::handleErrors(const simplecpp::OutputList& outputList, bool th const bool showerror = (!mSettings.userDefines.empty() && !mSettings.force); reportOutput(outputList, showerror); if (throwError) { - const auto it = std::find_if(outputList.cbegin(), outputList.cend(), [](const simplecpp::Output &output){ + const auto it = std::find_if(outputList.cbegin(), outputList.cend(), [](const simplecpp::Output &output) -> bool { return hasErrors(output); }); if (it != outputList.cend()) { diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index 573a4dfe96d..4aa977908ef 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -239,14 +239,14 @@ void ProgramMemory::copyOnWrite() ProgramMemory::Map::const_iterator ProgramMemory::find(nonneg int exprid) const { const auto& cvalues = utils::as_const(*mValues); - return std::find_if(cvalues.cbegin(), cvalues.cend(), [&exprid](const Map::value_type& entry) { + return std::find_if(cvalues.cbegin(), cvalues.cend(), [&exprid](const Map::value_type& entry) -> bool { return entry.first.getExpressionId() == exprid; }); } ProgramMemory::Map::iterator ProgramMemory::find(nonneg int exprid) { - return std::find_if(mValues->begin(), mValues->end(), [&exprid](const Map::value_type& entry) { + return std::find_if(mValues->begin(), mValues->end(), [&exprid](const Map::value_type& entry) -> bool { return entry.first.getExpressionId() == exprid; }); } @@ -474,7 +474,7 @@ static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok static void removeModifiedVars(ProgramMemory& pm, const Token* tok, const Token* origin, const Settings& settings) { - pm.erase_if([&](const ExprIdToken& e) { + pm.erase_if([&](const ExprIdToken& e) -> bool { return isVariableChanged(origin, tok, e.getExpressionId(), false, settings); }); } @@ -554,7 +554,7 @@ void ProgramMemoryState::removeModifiedVars(const Token* tok) return {0}; return {}; }; - state.erase_if([&](const ExprIdToken& e) { + state.erase_if([&](const ExprIdToken& e) -> bool { const Token* start = origins[e.getExpressionId()]; const Token* expr = e.tok; if (!expr || findExpressionChangedSkipDeadCode(expr, start, tok, settings, eval)) { @@ -819,7 +819,7 @@ static std::unordered_map createBuiltinLibr return v; }; functions["atan2"] = [](const std::vector& args) { - if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) { + if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) -> bool { return v.isFloatValue() || v.isIntValue(); })) return ValueFlow::Value::unknown(); @@ -830,7 +830,7 @@ static std::unordered_map createBuiltinLibr return v; }; functions["remainder"] = [](const std::vector& args) { - if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) { + if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) -> bool { return v.isFloatValue() || v.isIntValue(); })) return ValueFlow::Value::unknown(); @@ -841,7 +841,7 @@ static std::unordered_map createBuiltinLibr return v; }; functions["nextafter"] = [](const std::vector& args) { - if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) { + if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) -> bool { return v.isFloatValue() || v.isIntValue(); })) return ValueFlow::Value::unknown(); @@ -852,7 +852,7 @@ static std::unordered_map createBuiltinLibr return v; }; functions["nexttoward"] = [](const std::vector& args) { - if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) { + if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) -> bool { return v.isFloatValue() || v.isIntValue(); })) return ValueFlow::Value::unknown(); @@ -863,7 +863,7 @@ static std::unordered_map createBuiltinLibr return v; }; functions["hypot"] = [](const std::vector& args) { - if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) { + if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) -> bool { return v.isFloatValue() || v.isIntValue(); })) return ValueFlow::Value::unknown(); @@ -874,7 +874,7 @@ static std::unordered_map createBuiltinLibr return v; }; functions["fdim"] = [](const std::vector& args) { - if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) { + if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) -> bool { return v.isFloatValue() || v.isIntValue(); })) return ValueFlow::Value::unknown(); @@ -885,7 +885,7 @@ static std::unordered_map createBuiltinLibr return v; }; functions["fmax"] = [](const std::vector& args) { - if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) { + if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) -> bool { return v.isFloatValue() || v.isIntValue(); })) return ValueFlow::Value::unknown(); @@ -896,7 +896,7 @@ static std::unordered_map createBuiltinLibr return v; }; functions["fmin"] = [](const std::vector& args) { - if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) { + if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) -> bool { return v.isFloatValue() || v.isIntValue(); })) return ValueFlow::Value::unknown(); @@ -907,7 +907,7 @@ static std::unordered_map createBuiltinLibr return v; }; functions["fmod"] = [](const std::vector& args) { - if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) { + if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) -> bool { return v.isFloatValue() || v.isIntValue(); })) return ValueFlow::Value::unknown(); @@ -918,7 +918,7 @@ static std::unordered_map createBuiltinLibr return v; }; functions["pow"] = [](const std::vector& args) { - if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) { + if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) -> bool { return v.isFloatValue() || v.isIntValue(); })) return ValueFlow::Value::unknown(); @@ -929,7 +929,7 @@ static std::unordered_map createBuiltinLibr return v; }; functions["scalbln"] = [](const std::vector& args) { - if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) { + if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) -> bool { return v.isFloatValue() || v.isIntValue(); })) return ValueFlow::Value::unknown(); @@ -940,7 +940,7 @@ static std::unordered_map createBuiltinLibr return v; }; functions["ldexp"] = [](const std::vector& args) { - if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) { + if (args.size() != 2 || !std::all_of(args.cbegin(), args.cend(), [](const ValueFlow::Value& v) -> bool { return v.isFloatValue() || v.isIntValue(); })) return ValueFlow::Value::unknown(); @@ -1280,7 +1280,7 @@ static void pruneConditions(std::vector& conds, { conds.erase(std::remove_if(conds.begin(), conds.end(), - [&](const Token* cond) { + [&](const Token* cond) -> bool { if (cond->exprId() == 0) return false; auto it = state.find(cond->exprId()); @@ -1332,7 +1332,7 @@ namespace { } static bool sortConditions(std::vector& conditions) { - if (std::any_of(conditions.begin(), conditions.end(), [](const Token* child) { + if (std::any_of(conditions.begin(), conditions.end(), [](const Token* child) -> bool { return Token::Match(child, "&&|%oror%"); })) return false; @@ -1412,7 +1412,7 @@ namespace { if (diffConditions1.size() != diffConditions2.size()) continue; for (const Token* cond1 : diffConditions1) { - auto it = std::find_if(diffConditions2.begin(), diffConditions2.end(), [&](const Token* cond2) { + auto it = std::find_if(diffConditions2.begin(), diffConditions2.end(), [&](const Token* cond2) -> bool { return evalSameCondition(*pm, cond2, cond1, settings); }); if (it == diffConditions2.end()) @@ -1619,7 +1619,7 @@ namespace { std::vector tokArgs = getArguments(expr); std::vector args(tokArgs.size()); std::transform( - tokArgs.cbegin(), tokArgs.cend(), args.begin(), [&](const Token* tok) { + tokArgs.cbegin(), tokArgs.cend(), args.begin(), [&](const Token* tok) -> ValueFlow::Value { return execute(tok); }); if (f) { @@ -1657,7 +1657,7 @@ namespace { } } // Check if function modifies argument - visitAstNodes(expr->astOperand2(), [&](const Token* child) { + visitAstNodes(expr->astOperand2(), [&](const Token* child) -> ChildrenToVisit { if (child->exprId() > 0 && pm->hasValue(child->exprId())) { ValueFlow::Value& v = pm->at(child->exprId()); if (v.valueType == ValueFlow::Value::ValueType::CONTAINER_SIZE) { @@ -1688,7 +1688,7 @@ namespace { } } auto it = - std::max_element(values.begin(), values.end(), [](const ValueFlow::Value* x, const ValueFlow::Value* y) { + std::max_element(values.begin(), values.end(), [](const ValueFlow::Value* x, const ValueFlow::Value* y) -> bool { return x->intvalue < y->intvalue; }); if (it == values.end()) @@ -1707,7 +1707,7 @@ namespace { ValueFlow::Value execute(const Token* expr) { depth--; - OnExit onExit{[&] { + OnExit onExit{[&]() -> void { depth++; }}; if (depth < 0) diff --git a/lib/reverseanalyzer.cpp b/lib/reverseanalyzer.cpp index f1318295d6a..c9247a952b3 100644 --- a/lib/reverseanalyzer.cpp +++ b/lib/reverseanalyzer.cpp @@ -48,10 +48,10 @@ namespace { std::pair evalCond(const Token* tok) const { std::vector result = analyzer->evaluate(tok); // TODO: We should convert to bool - const bool checkThen = std::any_of(result.cbegin(), result.cend(), [](MathLib::bigint x) { + const bool checkThen = std::any_of(result.cbegin(), result.cend(), [](MathLib::bigint x) -> bool { return x == 1; }); - const bool checkElse = std::any_of(result.cbegin(), result.cend(), [](MathLib::bigint x) { + const bool checkElse = std::any_of(result.cbegin(), result.cend(), [](MathLib::bigint x) -> bool { return x == 0; }); return std::make_pair(checkThen, checkElse); @@ -119,7 +119,7 @@ namespace { bool updateRecursive(Token* start) { bool continueB = true; - visitAstNodes(start, [&](Token* tok) { + visitAstNodes(start, [&](Token* tok) -> ChildrenToVisit { const Token* parent = tok->astParent(); while (Token::simpleMatch(parent, ":")) parent = parent->astParent(); @@ -135,7 +135,7 @@ namespace { Analyzer::Action analyzeRecursive(const Token* start) const { Analyzer::Action result = Analyzer::Action::None; - visitAstNodes(start, [&](const Token* tok) { + visitAstNodes(start, [&](const Token* tok) -> ChildrenToVisit { result |= analyzer->analyze(tok, Analyzer::Direction::Reverse); if (result.isModified()) return ChildrenToVisit::done; diff --git a/lib/settings.h b/lib/settings.h index 41651dbbeb3..da931791a5a 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -479,7 +479,7 @@ class CPPCHECKLIB WARN_UNUSED Settings { * @return true for the file to be excluded. */ bool configurationExcluded(const std::string &file) const { - return std::any_of(configExcludePaths.begin(), configExcludePaths.end(), [&file](const std::string& path) { + return std::any_of(configExcludePaths.begin(), configExcludePaths.end(), [&file](const std::string& path) -> bool { return file.length() >= path.length() && file.compare(0, path.length(), path) == 0; }); } diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 6d723b60246..b5d62c14b66 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -151,7 +151,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() // Store the ending of init lists std::stack> endInitList; - auto inInitList = [&] { + auto inInitList = [&]() -> bool { if (endInitList.empty()) return false; return endInitList.top().second == scope; @@ -176,7 +176,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() std::map> forwardDecls; - const std::function findForwardDeclScope = [&](const Token *tok, Scope *startScope) { + const std::function findForwardDeclScope = [&](const Token *tok, Scope *startScope) -> Scope* { if (tok->str() == "::") return findForwardDeclScope(tok->next(), &scopeList.front()); @@ -1127,7 +1127,7 @@ void SymbolDatabase::createSymbolDatabaseVariableSymbolTable() void SymbolDatabase::createSymbolDatabaseSetScopePointers() { - auto setScopePointers = [](const Scope &scope, const Token *bodyStart, const Token *bodyEnd) { + auto setScopePointers = [](const Scope &scope, const Token *bodyStart, const Token *bodyEnd) -> void { assert(bodyStart); assert(bodyEnd); @@ -1579,7 +1579,7 @@ static bool isExpression(const Token* tok) if (!Token::Match(tok, "(|.|[|::|?|:|++|--|%cop%|%assign%")) return false; if (Token::Match(tok, "*|&|&&")) { - const Token* vartok = findAstNode(tok, [&](const Token* tok2) { + const Token* vartok = findAstNode(tok, [&](const Token* tok2) -> bool { const Variable* var = tok2->variable(); if (!var) return false; @@ -1725,7 +1725,7 @@ void SymbolDatabase::createSymbolDatabaseExprIds() } auto exprScopes = functionScopes; // functions + global lambdas + namespaces - std::copy_if(scopeList.front().nestedList.begin(), scopeList.front().nestedList.end(), std::back_inserter(exprScopes), [](const Scope* scope) { + std::copy_if(scopeList.front().nestedList.begin(), scopeList.front().nestedList.end(), std::back_inserter(exprScopes), [](const Scope* scope) -> bool { return scope && (scope->type == ScopeType::eLambda || scope->type == ScopeType::eNamespace); }); @@ -2151,7 +2151,7 @@ namespace { const Function* getFunctionForArgumentvariable(const Variable * const var) { if (const Scope* scope = var->nameToken()->scope()) { - auto it = std::find_if(scope->functionList.begin(), scope->functionList.end(), [&](const Function& function) { + auto it = std::find_if(scope->functionList.begin(), scope->functionList.end(), [&](const Function& function) -> bool { for (nonneg int arg = 0; arg < function.argCount(); ++arg) { if (var == function.getArgumentVar(arg)) return true; @@ -3166,28 +3166,28 @@ static bool checkReturns(const Function* function, bool unknown, bool emptyEnabl bool Function::returnsConst(const Function* function, bool unknown) { - return checkReturns(function, unknown, false, [](const Token* defStart, const Token* defEnd) { + return checkReturns(function, unknown, false, [](const Token* defStart, const Token* defEnd) -> const Token* { return Token::findsimplematch(defStart, "const", defEnd); }); } bool Function::returnsReference(const Function* function, bool unknown, bool includeRValueRef) { - return checkReturns(function, unknown, false, [includeRValueRef](const Token* /*defStart*/, const Token* defEnd) { + return checkReturns(function, unknown, false, [includeRValueRef](const Token* /*defStart*/, const Token* defEnd) -> bool { return includeRValueRef ? Token::Match(defEnd->previous(), "&|&&") : Token::simpleMatch(defEnd->previous(), "&"); }); } bool Function::returnsPointer(const Function* function, bool unknown) { - return checkReturns(function, unknown, false, [](const Token* /*defStart*/, const Token* defEnd) { + return checkReturns(function, unknown, false, [](const Token* /*defStart*/, const Token* defEnd) -> bool { return Token::simpleMatch(defEnd->previous(), "*"); }); } bool Function::returnsStandardType(const Function* function, bool unknown) { - return checkReturns(function, unknown, true, [](const Token* /*defStart*/, const Token* defEnd) { + return checkReturns(function, unknown, true, [](const Token* /*defStart*/, const Token* defEnd) -> bool { return defEnd->previous() && defEnd->previous()->isStandardType(); }); } @@ -3711,7 +3711,7 @@ bool Type::hasCircularDependencies(std::set* ancestors) const bool Type::findDependency(const Type* ancestor) const { - return this == ancestor || std::any_of(derivedFrom.cbegin(), derivedFrom.cend(), [&](const BaseInfo& d) { + return this == ancestor || std::any_of(derivedFrom.cbegin(), derivedFrom.cend(), [&](const BaseInfo& d) -> bool { return d.type && (d.type == this || d.type->findDependency(ancestor)); }); } @@ -4737,7 +4737,7 @@ const Function * Function::getOverriddenFunctionRecursive(const ::Type* baseType } if (isDestructor()) { - auto it = std::find_if(parent->functionList.begin(), parent->functionList.end(), [](const Function& f) { + auto it = std::find_if(parent->functionList.begin(), parent->functionList.end(), [](const Function& f) -> bool { return f.isDestructor() && f.isImplicitlyVirtual(); }); if (it != parent->functionList.end()) @@ -5597,7 +5597,7 @@ static bool hasEmptyCaptureList(const Token* tok) { bool Scope::hasInlineOrLambdaFunction(const Token** tokStart, bool onlyInline) const { - return std::any_of(nestedList.begin(), nestedList.end(), [&](const Scope* s) { + return std::any_of(nestedList.begin(), nestedList.end(), [&](const Scope* s) -> bool { // Inline function if (s->type == ScopeType::eUnconditional && Token::simpleMatch(s->bodyStart->previous(), ") {")) { if (tokStart) @@ -5763,7 +5763,7 @@ static bool hasMatchingConstructor(const Scope* classScope, const ValueType* arg return false; return std::any_of(classScope->functionList.cbegin(), classScope->functionList.cend(), - [&](const Function& f) { + [&](const Function& f) -> bool { if (!f.isConstructor() || f.argCount() != 1 || !f.getArgumentVar(0)) return false; const ValueType* vt = f.getArgumentVar(0)->valueType(); @@ -5787,7 +5787,7 @@ const Function* Scope::findFunction(const Token *tok, bool requireConst, Referen // find all the possible functions that could match const std::size_t args = arguments.size(); - auto addMatchingFunctions = [&](const Scope *scope) { + auto addMatchingFunctions = [&](const Scope *scope) -> void { auto range = utils::as_const(scope->functionMap).equal_range(tok->str()); for (auto it = range.first; it != range.second; ++it) { const Function *func = it->second; @@ -6021,7 +6021,7 @@ const Function* Scope::findFunction(const Token *tok, bool requireConst, Referen } // Fallback cases - auto fb_pred = [](const std::pair& a, const std::pair& b) { + auto fb_pred = [](const std::pair& a, const std::pair& b) -> bool { return a.second > b.second; }; // sort according to matching arguments @@ -6044,16 +6044,16 @@ const Function* Scope::findFunction(const Token *tok, bool requireConst, Referen } // remove pure virtual function if there is an overrider - auto itPure = std::find_if(matches.begin(), matches.end(), [](const Function* m) { + auto itPure = std::find_if(matches.begin(), matches.end(), [](const Function* m) -> bool { return m->isPure(); }); - if (itPure != matches.end() && std::any_of(matches.begin(), matches.end(), [&](const Function* m) { + if (itPure != matches.end() && std::any_of(matches.begin(), matches.end(), [&](const Function* m) -> bool { return m->isImplicitlyVirtual() && m != *itPure; })) matches.erase(itPure); // Only one candidate left - if (matches.size() == 1 && std::none_of(functionList.begin(), functionList.end(), [tok](const Function& f) { + if (matches.size() == 1 && std::none_of(functionList.begin(), functionList.end(), [tok](const Function& f) -> bool { return startsWith(f.name(), tok->str() + " <"); })) return matches[0]; @@ -6346,7 +6346,7 @@ Scope *Scope::findInNestedListRecursive(const std::string & name) const Function *Scope::getDestructor() const { - auto it = std::find_if(functionList.cbegin(), functionList.cend(), [](const Function& f) { + auto it = std::find_if(functionList.cbegin(), functionList.cend(), [](const Function& f) -> bool { return f.type == FunctionType::eDestructor; }); return it == functionList.end() ? nullptr : &*it; diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index 03be22fa49d..9979f0dbed4 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -1082,7 +1082,7 @@ class CPPCHECKLIB Scope { } const Enumerator * findEnumerator(const std::string & name) const { - auto it = std::find_if(enumeratorList.cbegin(), enumeratorList.cend(), [&](const Enumerator& i) { + auto it = std::find_if(enumeratorList.cbegin(), enumeratorList.cend(), [&](const Enumerator& i) -> bool { // Too detailed return i.name->str() == name; }); return it == enumeratorList.end() ? nullptr : &*it; diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index dfb4eb6d164..ada880a9ef2 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -769,7 +769,7 @@ static bool areAllParamsTypes(const std::vector ¶ms) if (params.empty()) return false; - return std::all_of(params.cbegin(), params.cend(), [](const Token* param) { + return std::all_of(params.cbegin(), params.cend(), [](const Token* param) -> bool { return Token::Match(param->previous(), "typename|class %name% ,|>"); }); } @@ -1830,7 +1830,7 @@ void TemplateSimplifier::expandTemplate( type = type->next(); } // check if type is instantiated - if (std::any_of(mTemplateInstantiations.cbegin(), mTemplateInstantiations.cend(), [&](const TokenAndName& inst) { + if (std::any_of(mTemplateInstantiations.cbegin(), mTemplateInstantiations.cend(), [&](const TokenAndName& inst) -> bool { return Token::simpleMatch(inst.token(), name.c_str(), name.size()); })) { // use the instantiated name @@ -3508,13 +3508,13 @@ void TemplateSimplifier::getSpecializations() // try to locate a matching declaration for each user defined specialization for (const auto& spec : mTemplateDeclarations) { if (spec.isSpecialization()) { - auto it = std::find_if(mTemplateDeclarations.cbegin(), mTemplateDeclarations.cend(), [&](const TokenAndName& decl) { + auto it = std::find_if(mTemplateDeclarations.cbegin(), mTemplateDeclarations.cend(), [&](const TokenAndName& decl) -> bool { return specMatch(spec, decl); }); if (it != mTemplateDeclarations.cend()) mTemplateSpecializationMap[spec.token()] = it->token(); else { - it = std::find_if(mTemplateForwardDeclarations.cbegin(), mTemplateForwardDeclarations.cend(), [&](const TokenAndName& decl) { + it = std::find_if(mTemplateForwardDeclarations.cbegin(), mTemplateForwardDeclarations.cend(), [&](const TokenAndName& decl) -> bool { return specMatch(spec, decl); }); if (it != mTemplateForwardDeclarations.cend()) @@ -3529,13 +3529,13 @@ void TemplateSimplifier::getPartialSpecializations() // try to locate a matching declaration for each user defined partial specialization for (const auto& spec : mTemplateDeclarations) { if (spec.isPartialSpecialization()) { - auto it = std::find_if(mTemplateDeclarations.cbegin(), mTemplateDeclarations.cend(), [&](const TokenAndName& decl) { + auto it = std::find_if(mTemplateDeclarations.cbegin(), mTemplateDeclarations.cend(), [&](const TokenAndName& decl) -> bool { return specMatch(spec, decl); }); if (it != mTemplateDeclarations.cend()) mTemplatePartialSpecializationMap[spec.token()] = it->token(); else { - it = std::find_if(mTemplateForwardDeclarations.cbegin(), mTemplateForwardDeclarations.cend(), [&](const TokenAndName& decl) { + it = std::find_if(mTemplateForwardDeclarations.cbegin(), mTemplateForwardDeclarations.cend(), [&](const TokenAndName& decl) -> bool { return specMatch(spec, decl); }); if (it != mTemplateForwardDeclarations.cend()) @@ -3904,7 +3904,7 @@ void TemplateSimplifier::simplifyTemplates(const std::time_t maxtime) nameOrdinal.emplace(decl.fullName(), ordinal++); } - auto score = [&](const Token* arg) { + auto score = [&](const Token* arg) -> int { int i = 0; for (const Token* tok = arg; tok; tok = tok->next()) { if (tok->str() == ",") @@ -3923,7 +3923,7 @@ void TemplateSimplifier::simplifyTemplates(const std::time_t maxtime) return 0; }; // Sort so const parameters come first in the list - mTemplateDeclarations.sort([&](const TokenAndName& x, const TokenAndName& y) { + mTemplateDeclarations.sort([&](const TokenAndName& x, const TokenAndName& y) -> bool { if (x.fullName() != y.fullName()) return nameOrdinal.at(x.fullName()) < nameOrdinal.at(y.fullName()); if (x.isFunction() && y.isFunction()) { @@ -3939,7 +3939,7 @@ void TemplateSimplifier::simplifyTemplates(const std::time_t maxtime) xargs.end(), yargs.begin(), yargs.end(), - [&](const Token* xarg, const Token* yarg) { + [&](const Token* xarg, const Token* yarg) -> bool { if (xarg != yarg) return score(xarg) < score(yarg); return false; @@ -3976,7 +3976,7 @@ void TemplateSimplifier::simplifyTemplates(const std::time_t maxtime) } for (auto it = mInstantiatedTemplates.cbegin(); it != mInstantiatedTemplates.cend(); ++it) { - auto decl = std::find_if(mTemplateDeclarations.begin(), mTemplateDeclarations.end(), [&it](const TokenAndName& decl) { + auto decl = std::find_if(mTemplateDeclarations.begin(), mTemplateDeclarations.end(), [&it](const TokenAndName& decl) -> bool { return decl.token() == it->token(); }); if (decl != mTemplateDeclarations.end()) { diff --git a/lib/timer.cpp b/lib/timer.cpp index 4b1f07d5de3..d60287e5e55 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -72,7 +72,7 @@ void TimerResults::showResults(SHOWTIME_MODES mode) const // Do not use inner timers in "Overall time" const std::string::size_type pos = iter->first.rfind("::"); if (pos != std::string::npos) - hasParent = std::any_of(data.cbegin(), data.cend(), [iter,pos](const dataElementType& d) { + hasParent = std::any_of(data.cbegin(), data.cend(), [iter,pos](const dataElementType& d) -> bool { return d.first.size() == pos && iter->first.compare(0, d.first.size(), d.first) == 0; }); } diff --git a/lib/token.cpp b/lib/token.cpp index 44e62e21507..fcb42299487 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -232,7 +232,7 @@ bool Token::isUpperCaseName() const { if (!isName()) return false; - return std::none_of(mStr.begin(), mStr.end(), [](char c) { + return std::none_of(mStr.begin(), mStr.end(), [](char c) -> int { return std::islower(c); }); } @@ -1779,7 +1779,7 @@ void Token::printValueFlow(const std::vector& files, bool xml, std: line = tok->linenr(); if (!xml) { ValueFlow::Value::ValueKind valueKind = values->front().valueKind; - const bool same = std::all_of(values->begin(), values->end(), [&](const ValueFlow::Value& value) { + const bool same = std::all_of(values->begin(), values->end(), [&](const ValueFlow::Value& value) -> bool { return value.valueKind == valueKind; }); outs += " "; @@ -1922,7 +1922,7 @@ const ValueFlow::Value * Token::getValueLE(const MathLib::bigint val, const Sett { if (!mImpl->mValues) return nullptr; - return ValueFlow::findValue(*mImpl->mValues, settings, [&](const ValueFlow::Value& v) { + return ValueFlow::findValue(*mImpl->mValues, settings, [&](const ValueFlow::Value& v) -> bool { return !v.isImpossible() && v.isIntValue() && v.intvalue <= val; }); } @@ -1931,7 +1931,7 @@ const ValueFlow::Value * Token::getValueGE(const MathLib::bigint val, const Sett { if (!mImpl->mValues) return nullptr; - return ValueFlow::findValue(*mImpl->mValues, settings, [&](const ValueFlow::Value& v) { + return ValueFlow::findValue(*mImpl->mValues, settings, [&](const ValueFlow::Value& v) -> bool { return !v.isImpossible() && v.isIntValue() && v.intvalue >= val; }); } @@ -1940,7 +1940,7 @@ const ValueFlow::Value * Token::getValueNE(MathLib::bigint val) const { if (!mImpl->mValues) return nullptr; - const auto it = std::find_if(mImpl->mValues->cbegin(), mImpl->mValues->cend(), [=](const ValueFlow::Value& value) { + const auto it = std::find_if(mImpl->mValues->cbegin(), mImpl->mValues->cend(), [=](const ValueFlow::Value& value) -> bool { return value.isIntValue() && !value.isImpossible() && value.intvalue != val; }); return it == mImpl->mValues->end() ? nullptr : &*it; @@ -2102,7 +2102,7 @@ static ValueIterator removeAdjacentValues(std::list& values, V if (it == last) it--; (*it)->bound = x->bound; - std::for_each(std::move(start), std::move(it), [&](ValueIterator y) { + std::for_each(std::move(start), std::move(it), [&](ValueIterator y) -> void { values.erase(y); }); return values.erase(x); @@ -2152,7 +2152,7 @@ static void mergeAdjacent(std::list& values) x++; continue; } - std::sort(adjValues.begin(), adjValues.end(), [&values](ValueIterator xx, ValueIterator yy) { + std::sort(adjValues.begin(), adjValues.end(), [&values](ValueIterator xx, ValueIterator yy) -> bool { (void)values; assert(xx != values.end() && yy != values.end()); return xx->compareValue(*yy, less{}); @@ -2216,14 +2216,14 @@ bool Token::addValue(const ValueFlow::Value &value) { if (value.isKnown() && mImpl->mValues) { // Clear all other values of the same type since value is known - mImpl->mValues->remove_if([&](const ValueFlow::Value& x) { + mImpl->mValues->remove_if([&](const ValueFlow::Value& x) -> bool { return sameValueType(x, value); }); } // Don't add a value if its already known if (!value.isKnown() && mImpl->mValues && - std::any_of(mImpl->mValues->begin(), mImpl->mValues->end(), [&](const ValueFlow::Value& x) { + std::any_of(mImpl->mValues->begin(), mImpl->mValues->end(), [&](const ValueFlow::Value& x) -> bool { return x.isKnown() && sameValueType(x, value) && !x.equalValue(value); })) return false; @@ -2379,7 +2379,7 @@ const ::Type* Token::typeOf(const Token* tok, const Token** typeTok) if (vars.empty()) return nullptr; if (std::all_of( - vars.cbegin(), vars.cend(), [&](const Variable* var) { + vars.cbegin(), vars.cend(), [&](const Variable* var) -> bool { return var->type() == vars.front()->type(); })) return vars.front()->type(); @@ -2529,7 +2529,7 @@ bool Token::hasKnownValue() const bool Token::hasKnownValue(ValueFlow::Value::ValueType t) const { return mImpl->mValues && - std::any_of(mImpl->mValues->begin(), mImpl->mValues->end(), [&](const ValueFlow::Value& value) { + std::any_of(mImpl->mValues->begin(), mImpl->mValues->end(), [&](const ValueFlow::Value& value) -> bool { return value.isKnown() && value.valueType == t; }); } @@ -2539,7 +2539,7 @@ bool Token::hasKnownSymbolicValue(const Token* tok) const if (tok->exprId() == 0) return false; return mImpl->mValues && - std::any_of(mImpl->mValues->begin(), mImpl->mValues->end(), [&](const ValueFlow::Value& value) { + std::any_of(mImpl->mValues->begin(), mImpl->mValues->end(), [&](const ValueFlow::Value& value) -> bool { return value.isKnown() && value.isSymbolicValue() && value.tokvalue && value.tokvalue->exprId() == tok->exprId(); }); @@ -2558,7 +2558,7 @@ const ValueFlow::Value* Token::getKnownValue(ValueFlow::Value::ValueType t) cons return nullptr; return &v; } - auto it = std::find_if(mImpl->mValues->begin(), mImpl->mValues->end(), [&](const ValueFlow::Value& value) { + auto it = std::find_if(mImpl->mValues->begin(), mImpl->mValues->end(), [&](const ValueFlow::Value& value) -> bool { return value.isKnown() && value.valueType == t; }); return it == mImpl->mValues->end() ? nullptr : &*it; @@ -2568,7 +2568,7 @@ const ValueFlow::Value* Token::getValue(const MathLib::bigint val) const { if (!mImpl->mValues) return nullptr; - const auto it = std::find_if(mImpl->mValues->begin(), mImpl->mValues->end(), [=](const ValueFlow::Value& value) { + const auto it = std::find_if(mImpl->mValues->begin(), mImpl->mValues->end(), [=](const ValueFlow::Value& value) -> bool { return value.isIntValue() && !value.isImpossible() && value.intvalue == val; }); return it == mImpl->mValues->end() ? nullptr : &*it; @@ -2612,7 +2612,7 @@ const ValueFlow::Value* Token::getMovedValue() const { if (!mImpl->mValues) return nullptr; - const auto it = std::find_if(mImpl->mValues->begin(), mImpl->mValues->end(), [](const ValueFlow::Value& value) { + const auto it = std::find_if(mImpl->mValues->begin(), mImpl->mValues->end(), [](const ValueFlow::Value& value) -> bool { return value.isMovedValue() && !value.isImpossible() && value.moveKind != ValueFlow::Value::MoveKind::NonMovedVariable; }); @@ -2624,7 +2624,7 @@ const ValueFlow::Value* Token::getContainerSizeValue(const MathLib::bigint val) { if (!mImpl->mValues) return nullptr; - const auto it = std::find_if(mImpl->mValues->begin(), mImpl->mValues->end(), [=](const ValueFlow::Value& value) { + const auto it = std::find_if(mImpl->mValues->begin(), mImpl->mValues->end(), [=](const ValueFlow::Value& value) -> bool { return value.isContainerSizeValue() && !value.isImpossible() && value.intvalue == val; }); return it == mImpl->mValues->end() ? nullptr : &*it; diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 8e60a31fede..775b8057daa 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2412,7 +2412,7 @@ namespace { const ScopeInfo3 * tempScope = this; while (tempScope) { // check children - auto it = std::find_if(tempScope->children.cbegin(), tempScope->children.cend(), [&](const ScopeInfo3& child) { + auto it = std::find_if(tempScope->children.cbegin(), tempScope->children.cend(), [&](const ScopeInfo3& child) -> bool { return &child != this && child.type == Record && (child.name == scope || child.fullName == scope); }); if (it != tempScope->children.end()) @@ -3407,16 +3407,16 @@ bool Tokenizer::simplifyTokens1(const std::string &configuration, int fileIndex) const SHOWTIME_MODES showTime = mTimerResults ? mSettings.showtime : SHOWTIME_MODES::SHOWTIME_NONE; - Timer::run("Tokenizer::simplifyTokens1::createAst", showTime, mTimerResults, [&]() { + Timer::run("Tokenizer::simplifyTokens1::createAst", showTime, mTimerResults, [&]() -> void { list.createAst(); list.validateAst(mSettings.debugnormal); }); - Timer::run("Tokenizer::simplifyTokens1::createSymbolDatabase", showTime, mTimerResults, [&]() { + Timer::run("Tokenizer::simplifyTokens1::createSymbolDatabase", showTime, mTimerResults, [&]() -> void { createSymbolDatabase(); }); - Timer::run("Tokenizer::simplifyTokens1::setValueType", showTime, mTimerResults, [&]() { + Timer::run("Tokenizer::simplifyTokens1::setValueType", showTime, mTimerResults, [&]() -> void { mSymbolDatabase->setValueTypeInTokenList(false); mSymbolDatabase->setValueTypeInTokenList(true); }); @@ -3431,7 +3431,7 @@ bool Tokenizer::simplifyTokens1(const std::string &configuration, int fileIndex) const bool doValueFlow = !disableValueflowEnv || (std::strcmp(disableValueflowEnv, "1") != 0); if (doValueFlow) { - Timer::run("Tokenizer::simplifyTokens1::ValueFlow", showTime, mTimerResults, [&]() { + Timer::run("Tokenizer::simplifyTokens1::ValueFlow", showTime, mTimerResults, [&]() -> void { ValueFlow::setValues(list, *mSymbolDatabase, mErrorLogger, mSettings, mTimerResults); }); @@ -5220,7 +5220,7 @@ void Tokenizer::setVarIdPass2() continue; // What member variables are there in this class? - std::transform(classnameTokens.cbegin(), classnameTokens.cend(), std::back_inserter(scopeInfo), [&](const Token* tok) { + std::transform(classnameTokens.cbegin(), classnameTokens.cend(), std::back_inserter(scopeInfo), [&](const Token* tok) -> ScopeInfo2 { return ScopeInfo2(tok->str(), tokStart->link()); }); @@ -5617,7 +5617,7 @@ bool Tokenizer::simplifyTokenList1(const char FileName[]) const SHOWTIME_MODES showTime = mTimerResults ? mSettings.showtime : SHOWTIME_MODES::SHOWTIME_NONE; // Bail out if code is garbage - Timer::run("Tokenizer::simplifyTokens1::simplifyTokenList1::findGarbageCode", showTime, mTimerResults, [&]() { + Timer::run("Tokenizer::simplifyTokens1::simplifyTokenList1::findGarbageCode", showTime, mTimerResults, [&]() -> void { findGarbageCode(); }); @@ -5774,7 +5774,7 @@ bool Tokenizer::simplifyTokenList1(const char FileName[]) simplifyTypedefLHS(); // typedef.. - Timer::run("Tokenizer::simplifyTokens1::simplifyTokenList1::simplifyTypedef", showTime, mTimerResults, [&]() { + Timer::run("Tokenizer::simplifyTokens1::simplifyTokenList1::simplifyTypedef", showTime, mTimerResults, [&]() -> void { simplifyTypedef(); }); @@ -5868,7 +5868,7 @@ bool Tokenizer::simplifyTokenList1(const char FileName[]) simplifyTypeIntrinsics(); // Handle templates.. - Timer::run("Tokenizer::simplifyTokens1::simplifyTokenList1::simplifyTemplates", showTime, mTimerResults, [&]() { + Timer::run("Tokenizer::simplifyTokens1::simplifyTokenList1::simplifyTemplates", showTime, mTimerResults, [&]() -> void { simplifyTemplates(); }); @@ -5895,7 +5895,7 @@ bool Tokenizer::simplifyTokenList1(const char FileName[]) validate(); // #6772 "segmentation fault (invalid code) in Tokenizer::setVarId" - Timer::run("Tokenizer::simplifyTokens1::simplifyTokenList1::setVarId", showTime, mTimerResults, [&](){ + Timer::run("Tokenizer::simplifyTokens1::simplifyTokenList1::setVarId", showTime, mTimerResults, [&]() -> void { setVarId(); }); @@ -6454,7 +6454,7 @@ void Tokenizer::splitTemplateRightAngleBrackets(bool check) if (tok->str() == "{") ++scopeLevel; else if (tok->str() == "}") { - vars.erase(std::remove_if(vars.begin(), vars.end(), [scopeLevel](const std::pair& v) { + vars.erase(std::remove_if(vars.begin(), vars.end(), [scopeLevel](const std::pair& v) -> bool { return v.second == scopeLevel; }), vars.end()); --scopeLevel; @@ -9660,7 +9660,7 @@ void Tokenizer::simplifyKeyword() tok->deleteNext(); if (c99) { - auto getTypeTokens = [tok]() { + auto getTypeTokens = [tok]() -> std::vector { std::vector ret; for (Token *temp = tok; Token::Match(temp, "%name%"); temp = temp->previous()) { if (!temp->isKeyword()) @@ -10011,7 +10011,7 @@ void Tokenizer::simplifyBitfields() } } - const auto tooLargeError = [this](const Token *tok) { + const auto tooLargeError = [this](const Token *tok) -> void { const MathLib::bigint max = std::numeric_limits::max(); reportError(tok, Severity::warning, @@ -10952,7 +10952,7 @@ void Tokenizer::setDirectives(std::list directives) bool Tokenizer::hasIfdef(const Token *start, const Token *end) const { const auto& directives = mDirectives; - return std::any_of(directives.cbegin(), directives.cend(), [&](const Directive& d) { + return std::any_of(directives.cbegin(), directives.cend(), [&](const Directive& d) -> bool { return startsWith(d.str, "#if") && d.linenr >= start->linenr() && d.linenr <= end->linenr() && @@ -10965,7 +10965,7 @@ bool Tokenizer::isPacked(const Token * bodyStart) const { const auto& directives = mDirectives; // TODO: should this return true if the #pragma exists in any line before the start token? - return std::any_of(directives.cbegin(), directives.cend(), [&](const Directive& d) { + return std::any_of(directives.cbegin(), directives.cend(), [&](const Directive& d) -> bool { return d.linenr < bodyStart->linenr() && d.str == "#pragma pack(1)" && d.file == list.getFiles().front(); }); } diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 678abeafff5..0e3b6b4c691 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -96,7 +96,7 @@ int TokenList::appendFileIfNew(std::string fileName) assert(!fileName.empty()); // Has this file been tokenized already? - auto it = std::find_if(mFiles.cbegin(), mFiles.cend(), [&](const std::string& f) { + auto it = std::find_if(mFiles.cbegin(), mFiles.cend(), [&](const std::string& f) -> bool { return Path::sameFileName(f, fileName); }); if (it != mFiles.cend()) @@ -593,14 +593,14 @@ static bool iscpp11init_impl(const Token * const tok) return true; } - auto isCaseStmt = [](const Token* colonTok) { + auto isCaseStmt = [](const Token* colonTok) -> bool { if (!Token::Match(colonTok->tokAt(-1), "%name%|%num%|%char%|) :")) return false; if (const Token* castTok = colonTok->linkAt(-1)) { if (Token::simpleMatch(castTok->astParent(), "case")) return true; } - if (findParent(colonTok->previous(), [](const Token *parent){ + if (findParent(colonTok->previous(), [](const Token *parent) -> bool { return parent->str() == "case"; })) return true; @@ -1852,7 +1852,7 @@ namespace { void TokenList::validateAst(bool print) const { - OnException oe{[&] { + OnException oe{[&]() -> void { if (print) mTokensFrontBack->front->printOut(std::cout); }}; diff --git a/lib/utils.h b/lib/utils.h index 07350660281..b22c5851513 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -152,7 +152,7 @@ inline static bool isStringCharLiteral(const std::string &str, char q) return false; static const std::array suffixes{"", "u8", "u", "U", "L"}; - return std::any_of(suffixes.cbegin(), suffixes.cend(), [&](const std::string& p) { + return std::any_of(suffixes.cbegin(), suffixes.cend(), [&](const std::string& p) -> bool { return isPrefixStringCharLiteral(str, q, p); }); } diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 070aa56742e..ef560621e2f 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -173,7 +173,7 @@ static void changeKnownToPossible(std::list& values, int indir static void removeImpossible(std::list& values, int indirect = -1) { - values.remove_if([&](const ValueFlow::Value& v) { + values.remove_if([&](const ValueFlow::Value& v) -> bool { if (indirect >= 0 && v.indirect != indirect) return false; return v.isImpossible(); @@ -321,7 +321,7 @@ static void parseCompareEachInt( if (const ValueFlow::Value* v = t->getKnownValue(ValueFlow::Value::ValueType::INT)) return {*v}; std::vector result; - std::copy_if(t->values().cbegin(), t->values().cend(), std::back_inserter(result), [&](const ValueFlow::Value& v) { + std::copy_if(t->values().cbegin(), t->values().cend(), std::back_inserter(result), [&](const ValueFlow::Value& v) -> bool { if (v.path < 1) return false; if (!isNonConditionalPossibleIntValue(v)) @@ -340,7 +340,7 @@ const Token* ValueFlow::parseCompareInt(const Token* tok, const Token* result = nullptr; parseCompareEachInt( tok, - [&](const Token* vartok, ValueFlow::Value true_value2, ValueFlow::Value false_value2) { + [&](const Token* vartok, ValueFlow::Value true_value2, ValueFlow::Value false_value2) -> void { if (result) return; result = vartok; @@ -351,7 +351,7 @@ const Token* ValueFlow::parseCompareInt(const Token* tok, std::vector r; std::vector v = evaluate(t); - std::transform(v.cbegin(), v.cend(), std::back_inserter(r), [&](MathLib::bigint i) { + std::transform(v.cbegin(), v.cend(), std::back_inserter(r), [&](MathLib::bigint i)-> ValueFlow::Value { return ValueFlow::Value{i}; }); return r; @@ -445,7 +445,7 @@ static Result accumulateStructMembers(const Scope* scope, F f, ValueFlow::Accura if (const ValueType* vt = var.valueType()) { if (vt->type == ValueType::Type::RECORD && vt->typeScope == scope) return {0, false}; - const MathLib::bigint dim = std::accumulate(var.dimensions().cbegin(), var.dimensions().cend(), 1LL, [](MathLib::bigint i1, const Dimension& dim) { + const MathLib::bigint dim = std::accumulate(var.dimensions().cbegin(), var.dimensions().cend(), 1LL, [](MathLib::bigint i1, const Dimension& dim) { // TODO: no suggestion return i1 * dim.num; }); if (var.nameToken()->scope() != scope && var.nameToken()->scope()->definedType) { // anonymous union @@ -487,14 +487,14 @@ static size_t getAlignOf(const ValueType& vt, const Settings& settings, ValueFlo return align == 0 ? 0 : bitCeil(align); } if (vt.type == ValueType::Type::RECORD && vt.typeScope) { - auto accHelper = [&](size_t max, const ValueType& vt2, size_t /*dim*/, MathLib::bigint /*bits*/) { + auto accHelper = [&](size_t max, const ValueType& vt2, size_t /*dim*/, MathLib::bigint /*bits*/) -> unsigned long { // TODO: too specific type { size_t a = getAlignOf(vt2, settings, accuracy, ++maxRecursion); return std::max(max, a); }; Result result = accumulateStructMembers(vt.typeScope, accHelper, accuracy); size_t total = result.total; if (const Type* dt = vt.typeScope->definedType) { - total = std::accumulate(dt->derivedFrom.begin(), dt->derivedFrom.end(), total, [&](size_t v, const Type::BaseInfo& bi) { + total = std::accumulate(dt->derivedFrom.begin(), dt->derivedFrom.end(), total, [&](size_t v, const Type::BaseInfo& bi) -> size_t { if (bi.type && bi.type->classScope) v += accumulateStructMembers(bi.type->classScope, accHelper, accuracy).total; return v; @@ -588,7 +588,7 @@ size_t ValueFlow::getSizeOf(const ValueType &vt, const Settings &settings, Accur if (currentBitCount > 0) total += currentBitfieldAlloc; if (const Type* dt = vt.typeScope->definedType) { - total = std::accumulate(dt->derivedFrom.begin(), dt->derivedFrom.end(), total, [&](size_t v, const Type::BaseInfo& bi) { + total = std::accumulate(dt->derivedFrom.begin(), dt->derivedFrom.end(), total, [&](size_t v, const Type::BaseInfo& bi) -> size_t { if (bi.type && bi.type->classScope) v += accumulateStructMembers(bi.type->classScope, accHelper, accuracy).total; return v; @@ -712,7 +712,7 @@ static bool hasUnknownType(const std::vector& toks) { if (toks.empty()) return true; - return std::any_of(toks.begin(), toks.end(), [&](const Token* tok) { + return std::any_of(toks.begin(), toks.end(), [&](const Token* tok) -> bool { if (!tok) return true; if (Token::Match(tok, "const|volatile|&|*|&&|%type%|::")) @@ -728,7 +728,7 @@ static bool hasUnknownType(const std::vector& toks) static void stripCV(std::vector& toks) { auto it = - std::find_if(toks.begin(), toks.end(), [&](const Token* tok) { + std::find_if(toks.begin(), toks.end(), [&](const Token* tok) -> bool { return !Token::Match(tok, "const|volatile"); }); if (it == toks.begin()) @@ -809,7 +809,7 @@ static void valueFlowTypeTraits(TokenList& tokenlist, const Settings& settings) if (eval.count(traitName) == 0) continue; auto args = evaluateTemplateArgs(templateTok->next()); - if (std::any_of(args.begin(), args.end(), [](const std::vector& arg) { + if (std::any_of(args.begin(), args.end(), [](const std::vector& arg) -> bool { return arg.empty(); })) continue; @@ -1304,7 +1304,7 @@ static void valueFlowImpossibleValues(TokenList& tokenList, const Settings& sett std::copy_if(tok2->values().cbegin(), tok2->values().cend(), std::back_inserter(values), - [](const ValueFlow::Value& v) { + [](const ValueFlow::Value& v) -> bool { if (!v.isKnown()) return false; return v.isSymbolicValue(); @@ -1646,7 +1646,7 @@ std::string ValueFlow::lifetimeMessage(const Token *tok, const ValueFlow::Value std::vector ValueFlow::getLifetimeObjValues(const Token* tok, bool inconclusive, MathLib::bigint path) { std::vector result; - auto pred = [&](const ValueFlow::Value& v) { + auto pred = [&](const ValueFlow::Value& v) -> bool { if (!v.isLocalLifetimeValue() && !(path != 0 && v.isSubFunctionLifetimeValue())) return false; if (!inconclusive && v.isInconclusive()) @@ -1844,7 +1844,7 @@ static std::vector getLifetimeTokens(const Token* tok, !Token::simpleMatch(getArgumentStart(tok), ",") && getArgumentStart(tok)->valueType()) { const Token* vartok = getArgumentStart(tok); auto vts = getParentValueTypes(tok, settings); - auto it = std::find_if(vts.cbegin(), vts.cend(), [&](const ValueType& vt) { + auto it = std::find_if(vts.cbegin(), vts.cend(), [&](const ValueType& vt) { // TODO: no suggestion return vt.isTypeEqual(vartok->valueType()); }); if (it != vts.end()) @@ -1855,7 +1855,7 @@ static std::vector getLifetimeTokens(const Token* tok, std::vector ValueFlow::getLifetimeTokens(const Token* tok, const Settings& settings, bool escape, ErrorPath errorPath) { - return getLifetimeTokens(tok, escape, std::move(errorPath), [](const Token*) { + return getLifetimeTokens(tok, escape, std::move(errorPath), [](const Token*) -> bool { return false; }, settings); } @@ -1863,7 +1863,7 @@ std::vector ValueFlow::getLifetimeTokens(const Token* bool ValueFlow::hasLifetimeToken(const Token* tok, const Token* lifetime, const Settings& settings) { bool result = false; - getLifetimeTokens(tok, false, ErrorPath{}, [&](const Token* tok2) { + getLifetimeTokens(tok, false, ErrorPath{}, [&](const Token* tok2) -> bool { result = tok2->exprId() == lifetime->exprId(); return result; }, settings); @@ -2097,7 +2097,7 @@ const Token* ValueFlow::getEndOfExprScope(const Token* tok, const Scope* default { const Token* end = nullptr; bool local = false; - visitAstNodes(tok, [&](const Token* child) { + visitAstNodes(tok, [&](const Token* child) -> ChildrenToVisit { if (const Variable* var = child->variable()) { local |= var->isLocal(); if (var->isLocal() || var->isArgument()) { @@ -2168,8 +2168,8 @@ static void valueFlowForwardLifetime(Token * tok, const TokenList &tokenlist, Er std::list values = parent->astOperand2()->values(); values.remove_if(&isNotLifetimeValue); // Dont forward lifetimes that overlap - values.remove_if([&](const ValueFlow::Value& value) { - return findAstNode(value.tokvalue, [&](const Token* child) { + values.remove_if([&](const ValueFlow::Value& value) -> const Token * { + return findAstNode(value.tokvalue, [&](const Token* child) -> bool { return child->exprId() == expr->exprId(); }); }); @@ -2339,7 +2339,7 @@ struct LifetimeStore { tokenlist, errorLogger, settings, - [](const Token*) { + [](const Token*) -> bool { return true; }, loc); @@ -2434,7 +2434,7 @@ struct LifetimeStore { tokenlist, errorLogger, settings, - [](const Token*) { + [](const Token*) -> bool { return true; }, loc); @@ -2490,7 +2490,7 @@ struct LifetimeStore { tokenlist, errorLogger, settings, - [](const Token*) { + [](const Token*) -> bool { return true; }, loc); @@ -2509,10 +2509,10 @@ static bool hasBorrowingVariables(const std::list& vars, const std::ve { if (depth < 0) return true; - return std::any_of(vars.cbegin(), vars.cend(), [&](const Variable& var) { + return std::any_of(vars.cbegin(), vars.cend(), [&](const Variable& var) -> bool { if (const ValueType* vt = var.valueType()) { if (vt->pointer > 0 && - std::none_of(args.begin(), args.end(), [vt](const Token* arg) { + std::none_of(args.begin(), args.end(), [vt](const Token* arg) -> bool { return arg->valueType() && arg->valueType()->type == vt->type; })) return false; @@ -2600,7 +2600,7 @@ static void valueFlowLifetimeUserConstructor(Token* tok, args, "Passed to constructor of '" + name + "'.", ValueFlow::Value::LifetimeKind::SubObject, - [&](LifetimeStore& ls) { + [&](LifetimeStore& ls) -> void { const Variable* paramVar = argToParam.at(ls.argtok); if (paramCapture.count(paramVar) == 0) return; @@ -2617,7 +2617,7 @@ static void valueFlowLifetimeUserConstructor(Token* tok, args, "Passed to constructor of '" + name + "'.", ValueFlow::Value::LifetimeKind::SubObject, - [&](LifetimeStore& ls) { + [&](LifetimeStore& ls) -> void { ls.inconclusive = true; const Variable* var = argToParam.at(ls.argtok); if (var && !var->isConst() && var->isReference()) @@ -2843,7 +2843,7 @@ static void valueFlowLifetimeClassConstructor(Token* tok, args, "Passed to initializer list.", ValueFlow::Value::LifetimeKind::SubObject, - [&](LifetimeStore& ls) { + [&](LifetimeStore& ls) -> void { ls.inconclusive = true; ls.byVal(tok, tokenlist, errorLogger, settings); }); @@ -2864,9 +2864,9 @@ static void valueFlowLifetimeClassConstructor(Token* tok, args, "Passed to constructor of '" + t->name() + "'.", ValueFlow::Value::LifetimeKind::SubObject, - [&](LifetimeStore& ls) { + [&](LifetimeStore& ls) -> void { // Skip static variable - it = std::find_if(it, scope->varlist.cend(), [](const Variable& var) { + it = std::find_if(it, scope->varlist.cend(), [](const Variable& var) -> bool { return !var.isStatic(); }); if (it == scope->varlist.cend()) @@ -2913,7 +2913,7 @@ static void valueFlowLifetimeConstructor(Token* tok, const TokenList& tokenlist, args, "Passed to initializer list.", ValueFlow::Value::LifetimeKind::SubObject, - [&](LifetimeStore& ls) { + [&](LifetimeStore& ls) -> void { ls.byVal(tok, tokenlist, errorLogger, settings); }); } else if (vt.container && vt.type == ValueType::CONTAINER) { @@ -2929,7 +2929,7 @@ static void valueFlowLifetimeConstructor(Token* tok, const TokenList& tokenlist, args, "Passed to initializer list.", ValueFlow::Value::LifetimeKind::SubObject, - [&](const LifetimeStore& ls) { + [&](const LifetimeStore& ls) -> void { ls.byDerefCopy(tok, tokenlist, errorLogger, settings); }); } else if (vt.container->hasInitializerListConstructor) { @@ -2939,7 +2939,7 @@ static void valueFlowLifetimeConstructor(Token* tok, const TokenList& tokenlist, args, "Passed to initializer list.", ValueFlow::Value::LifetimeKind::SubObject, - [&](LifetimeStore& ls) { + [&](LifetimeStore& ls) -> void { ls.byVal(tok, tokenlist, errorLogger, settings); }); } @@ -3027,7 +3027,7 @@ static bool isDecayedPointer(const Token *tok) static bool isConvertedToView(const Token* tok, const Settings& settings) { std::vector vtParents = getParentValueTypes(tok, settings); - return std::any_of(vtParents.cbegin(), vtParents.cend(), [&](const ValueType& vt) { + return std::any_of(vtParents.cbegin(), vtParents.cend(), [&](const ValueType& vt) -> bool { if (!vt.container) return false; return vt.container->view; @@ -3062,7 +3062,7 @@ static void valueFlowLifetime(TokenList &tokenlist, ErrorLogger &errorLogger, co std::set varids; bool capturedThis = false; - auto isImplicitCapturingVariable = [&](const Token *varTok) { + auto isImplicitCapturingVariable = [&](const Token *varTok) -> bool { const Variable *var = varTok->variable(); if (!var) return false; @@ -3083,7 +3083,7 @@ static void valueFlowLifetime(TokenList &tokenlist, ErrorLogger &errorLogger, co }; bool update = false; - auto captureVariable = [&](const Token* tok2, LifetimeCapture c, const std::function &pred) { + auto captureVariable = [&](const Token* tok2, LifetimeCapture c, const std::function &pred) -> void { if (varids.count(tok->varId()) > 0) return; if (c == LifetimeCapture::ByReference) { @@ -3100,7 +3100,7 @@ static void valueFlowLifetime(TokenList &tokenlist, ErrorLogger &errorLogger, co } }; - auto captureThisVariable = [&](const Token* tok2, LifetimeCapture c) { + auto captureThisVariable = [&](const Token* tok2, LifetimeCapture c) -> void { ValueFlow::Value value; value.valueType = ValueFlow::Value::ValueType::LIFETIME; if (c == LifetimeCapture::ByReference) @@ -3126,14 +3126,14 @@ static void valueFlowLifetime(TokenList &tokenlist, ErrorLogger &errorLogger, co if (Token::Match(tok2, "this !!.")) { captureThisVariable(tok2, c); } else if (var) { - captureVariable(tok2, c, [](const Token*) { + captureVariable(tok2, c, [](const Token*) -> bool { return true; }); varids.insert(var->declarationId()); } } - auto isImplicitCapturingThis = [&](const Token* tok2) { + auto isImplicitCapturingThis = [&](const Token* tok2) -> bool { if (capturedThis) return false; if (Token::simpleMatch(tok2, "this")) @@ -3504,7 +3504,7 @@ static std::vector getConditions(const Token* tok, const char* op) std::vector conds = {tok}; if (tok->str() == op) { std::vector args = astFlatten(tok, op); - std::copy_if(args.cbegin(), args.cend(), std::back_inserter(conds), [&](const Token* tok2) { + std::copy_if(args.cbegin(), args.cend(), std::back_inserter(conds), [&](const Token* tok2) -> bool { if (tok2->exprId() == 0) return false; if (tok2->hasKnownIntValue()) @@ -3704,7 +3704,7 @@ static ValueFlow::Value makeSymbolic(const Token* tok, MathLib::bigint delta = 0 static std::set getVarIds(const Token* tok) { std::set result; - visitAstNodes(tok, [&](const Token* child) { + visitAstNodes(tok, [&](const Token* child) -> ChildrenToVisit { if (child->varId() > 0) result.insert(child->varId()); return ChildrenToVisit::op1_and_op2; @@ -3743,7 +3743,7 @@ static void valueFlowSymbolic(const TokenList& tokenlist, const SymbolDatabase& } const std::set rhsVarIds = getVarIds(tok->astOperand2()); const std::vector vars = getLHSVariables(tok); - if (std::any_of(vars.cbegin(), vars.cend(), [&](const Variable* var) { + if (std::any_of(vars.cbegin(), vars.cend(), [&](const Variable* var) -> bool { if (rhsVarIds.count(var->declarationId()) > 0) return true; if (var->isLocal()) @@ -3752,7 +3752,7 @@ static void valueFlowSymbolic(const TokenList& tokenlist, const SymbolDatabase& })) continue; - if (findAstNode(tok, [](const Token* child) { + if (findAstNode(tok, [](const Token* child) -> bool { return child->isIncompleteVar(); })) continue; @@ -3862,7 +3862,7 @@ static void valueFlowSymbolicOperators(const SymbolDatabase& symboldatabase, con std::copy_if(vartok->values().cbegin(), vartok->values().cend(), std::back_inserter(values), - [&](const ValueFlow::Value& v) { + [&](const ValueFlow::Value& v) -> bool { if (!v.isSymbolicValue()) return false; if (!v.tokvalue) @@ -3972,10 +3972,10 @@ static void valueFlowForwardConst(Token* start, for (const ValueFlow::Value& value : values) setTokenValue(tok, value, settings); } else { - [&] { + [&]() -> void { // Follow references auto refs = followAllReferences(tok); - auto it = std::find_if(refs.cbegin(), refs.cend(), [&](const ReferenceToken& ref) { + auto it = std::find_if(refs.cbegin(), refs.cend(), [&](const ReferenceToken& ref) { // TODO: no suggestion return ref.token->varId() == var->declarationId(); }); if (it != refs.end()) { @@ -4081,7 +4081,7 @@ static void valueFlowForwardAssign(Token* const tok, values.remove_if(std::mem_fn(&ValueFlow::Value::isLifetimeValue)); } if (std::all_of( - vars.cbegin(), vars.cend(), [&](const Variable* var) { + vars.cbegin(), vars.cend(), [&](const Variable* var) -> bool { return !var->isPointer() && !var->isSmartPointer(); })) values.remove_if(std::mem_fn(&ValueFlow::Value::isTokValue)); @@ -4117,7 +4117,7 @@ static void valueFlowForwardAssign(Token* const tok, lowerToPossible(values); // is volatile - if (std::any_of(vars.cbegin(), vars.cend(), [&](const Variable* var) { + if (std::any_of(vars.cbegin(), vars.cend(), [&](const Variable* var) -> bool { return var->isVolatile(); })) lowerToPossible(values); @@ -4136,7 +4136,7 @@ static void valueFlowForwardAssign(Token* const tok, } // Const variable if (expr->variable() && expr->variable()->isConst() && !expr->variable()->isReference()) { - auto it = std::remove_if(values.begin(), values.end(), [](const ValueFlow::Value& value) { + auto it = std::remove_if(values.begin(), values.end(), [](const ValueFlow::Value& value) -> bool { if (!value.isKnown()) return false; if (value.isIntValue()) @@ -4157,7 +4157,7 @@ static void valueFlowForwardAssign(Token* const tok, // Check if variable is only incremented or decremented ValueFlow::Value::Bound b = findVarBound(expr->variable(), nextExpression, endOfVarScope, settings); if (b != ValueFlow::Value::Bound::Point) { - auto knownValueIt = std::find_if(values.begin(), values.end(), [](const ValueFlow::Value& value) { + auto knownValueIt = std::find_if(values.begin(), values.end(), [](const ValueFlow::Value& value) -> bool { if (!value.isKnown()) return false; return value.isIntValue(); @@ -4199,7 +4199,7 @@ static std::list truncateValues(std::list va if (src) { const size_t osz = ValueFlow::getSizeOf(*src, settings, ValueFlow::Accuracy::ExactOrZero); if (osz >= sz && dst->sign == ValueType::Sign::SIGNED && src->sign == ValueType::Sign::UNSIGNED) { - values.remove_if([&](const ValueFlow::Value& value) { + values.remove_if([&](const ValueFlow::Value& value) -> bool { if (!value.isIntValue()) return false; if (!value.isImpossible()) @@ -4313,16 +4313,16 @@ static void valueFlowAfterAssign(TokenList &tokenlist, types.insert(value.valueType); } } - values.remove_if([&](const ValueFlow::Value& value) { + values.remove_if([&](const ValueFlow::Value& value) -> bool { return types.count(value.valueType) > 0; }); // Remove container size if its not a container if (!astIsContainer(tok->astOperand2())) - values.remove_if([&](const ValueFlow::Value& value) { + values.remove_if([&](const ValueFlow::Value& value) -> bool { return value.valueType == ValueFlow::Value::ValueType::CONTAINER_SIZE; }); // Remove symbolic values that are the same as the LHS - values.remove_if([&](const ValueFlow::Value& value) { + values.remove_if([&](const ValueFlow::Value& value) -> bool { if (value.isSymbolicValue() && value.tokvalue) return value.tokvalue->exprId() == tok->astOperand1()->exprId(); return false; @@ -4330,20 +4330,20 @@ static void valueFlowAfterAssign(TokenList &tokenlist, // Find references to LHS in RHS auto isIncremental = [&](const Token* tok2) -> bool { return findAstNode(tok2, - [&](const Token* child) { + [&](const Token* child) -> bool { return child->exprId() == tok->astOperand1()->exprId(); }); }; // Check symbolic values as well const bool incremental = isIncremental(tok->astOperand2()) || - std::any_of(values.cbegin(), values.cend(), [&](const ValueFlow::Value& value) { + std::any_of(values.cbegin(), values.cend(), [&](const ValueFlow::Value& value) -> bool { if (!value.isSymbolicValue()) return false; return isIncremental(value.tokvalue); }); // Remove values from the same assignment if it is incremental if (incremental) { - values.remove_if([&](const ValueFlow::Value& value) { + values.remove_if([&](const ValueFlow::Value& value) -> bool { if (value.tokvalue) return value.tokvalue == tok->astOperand2(); return false; @@ -4352,7 +4352,7 @@ static void valueFlowAfterAssign(TokenList &tokenlist, // If assignment copy by value, remove Uninit values.. if ((tok->astOperand1()->valueType() && tok->astOperand1()->valueType()->pointer == 0) || (tok->astOperand1()->variable() && tok->astOperand1()->variable()->isReference() && tok->astOperand1()->variable()->nameToken() == tok->astOperand1())) - values.remove_if([&](const ValueFlow::Value& value) { + values.remove_if([&](const ValueFlow::Value& value) -> bool { return value.isUninitValue(); }); if (values.empty()) @@ -4401,7 +4401,7 @@ static void valueFlowAfterAssign(TokenList &tokenlist, static std::vector getVariables(const Token* tok) { std::vector result; - visitAstNodes(tok, [&](const Token* child) { + visitAstNodes(tok, [&](const Token* child) -> ChildrenToVisit { if (child->variable()) result.push_back(child->variable()); return ChildrenToVisit::op1_and_op2; @@ -4496,12 +4496,12 @@ struct ConditionHandler { static MathLib::bigint findPath(const std::list& values) { - auto it = std::find_if(values.cbegin(), values.cend(), [](const ValueFlow::Value& v) { + auto it = std::find_if(values.cbegin(), values.cend(), [](const ValueFlow::Value& v) -> bool { return v.path > 0; }); if (it == values.end()) return 0; - assert(std::all_of(it, values.end(), [&](const ValueFlow::Value& v) { + assert(std::all_of(it, values.end(), [&](const ValueFlow::Value& v) -> bool { return v.path == 0 || v.path == it->path; })); return it->path; @@ -4624,7 +4624,7 @@ struct ConditionHandler { ErrorLogger& errorLogger, const Settings& settings, const std::set& skippedFunctions) const { - traverseCondition(symboldatabase, settings, skippedFunctions, [&](const Condition& cond, Token* tok, const Scope*) { + traverseCondition(symboldatabase, settings, skippedFunctions, [&](const Condition& cond, Token* tok, const Scope*) -> void { if (cond.vartok->exprId() == 0) return; @@ -4670,7 +4670,7 @@ struct ConditionHandler { if (cond.vartok->valueType() && cond.vartok->valueType()->sign != ValueType::Sign::UNSIGNED) return; - values.remove_if([](const ValueFlow::Value& v) { + values.remove_if([](const ValueFlow::Value& v) -> bool { if (v.isIntValue()) return v.intvalue != 0; return false; @@ -4704,7 +4704,7 @@ struct ConditionHandler { if (findExpressionChanged(cond.vartok, start, end, settings)) { // If its reassigned in loop then analyze from the end if (!Token::Match(tok, "%assign%|++|--") && - findExpression(cond.vartok->exprId(), start, end, [&](const Token* tok2) { + findExpression(cond.vartok->exprId(), start, end, [&](const Token* tok2) -> bool { return Token::Match(tok2->astParent(), "%assign%") && astIsLHS(tok2); }) && !findEscapeStatement(block->scope(), settings.library)) { // Start at the end of the loop body @@ -4760,8 +4760,8 @@ struct ConditionHandler { { if (path < 1) return; - visitAstNodes(top, [&](const Token* tok) { - const ValueFlow::Value* v = ValueFlow::findValue(tok->values(), settings, [&](const ValueFlow::Value& v) { + visitAstNodes(top, [&](const Token* tok) -> ChildrenToVisit { + const ValueFlow::Value* v = ValueFlow::findValue(tok->values(), settings, [&](const ValueFlow::Value& v) -> bool { return v.path == path && isNonConditionalPossibleIntValue(v); }); if (v == nullptr) @@ -4776,7 +4776,7 @@ struct ConditionHandler { ErrorLogger& errorLogger, const Settings& settings, const std::set& skippedFunctions) const { - traverseCondition(symboldatabase, settings, skippedFunctions, [&](const Condition& cond, Token* condTok, const Scope* scope) { + traverseCondition(symboldatabase, settings, skippedFunctions, [&](const Condition& cond, Token* condTok, const Scope* scope) -> void { const MathLib::bigint path = cond.getPath(); const bool allowKnown = path == 0; @@ -4812,10 +4812,10 @@ struct ConditionHandler { changePossibleToKnown(values); if (astIsFloat(cond.vartok, false) || (!cond.vartok->valueType() && - std::all_of(values.cbegin(), values.cend(), [](const ValueFlow::Value& v) { + std::all_of(values.cbegin(), values.cend(), [](const ValueFlow::Value& v) -> bool { return v.isIntValue() || v.isFloatValue(); }))) - values.remove_if([&](const ValueFlow::Value& v) { + values.remove_if([&](const ValueFlow::Value& v) -> bool { return v.isImpossible(); }); for (Token* start:nextExprs) { @@ -5068,7 +5068,7 @@ struct ConditionHandler { } if (values.empty()) return; - const bool isKnown = std::any_of(values.cbegin(), values.cend(), [&](const ValueFlow::Value& v) { + const bool isKnown = std::any_of(values.cbegin(), values.cend(), [&](const ValueFlow::Value& v) -> bool { return v.isKnown() || v.isImpossible(); }); if (isKnown && isBreakOrContinueScope(after)) { @@ -5114,7 +5114,7 @@ struct SimpleConditionHandler : ConditionHandler { std::vector parse(const Token* tok, const Settings& /*settings*/) const override { std::vector conds; - parseCompareEachInt(tok, [&](const Token* vartok, ValueFlow::Value true_value, ValueFlow::Value false_value) { + parseCompareEachInt(tok, [&](const Token* vartok, ValueFlow::Value true_value, ValueFlow::Value false_value) -> void { if (vartok->hasKnownIntValue()) return; if (vartok->str() == "=" && vartok->astOperand1() && vartok->astOperand2()) @@ -5272,7 +5272,7 @@ struct SymbolicConditionHandler : SimpleConditionHandler { return {}; std::vector result; - auto addCond = [&](const Token* lhsTok, const Token* rhsTok, bool inverted) { + auto addCond = [&](const Token* lhsTok, const Token* rhsTok, bool inverted) -> void { for (int i = 0; i < 2; i++) { const bool lhs = i == 0; const Token* vartok = lhs ? lhsTok : rhsTok; @@ -5331,7 +5331,7 @@ static bool valueFlowForLoop2(const Token *tok, // If a variable is reassigned in second expression, return false bool reassign = false; visitAstNodes(secondExpression, - [&](const Token *t) { + [&](const Token *t) -> ChildrenToVisit { if (t->str() == "=" && t->astOperand1() && programMemory.hasValue(t->astOperand1()->varId())) // TODO: investigate what variable is assigned. reassign = true; @@ -5587,7 +5587,7 @@ static bool productParams(const Settings& settings, const std::unordered_map void { Args new_args; for (auto arg : args) { if (value.path != 0) { @@ -5633,7 +5633,7 @@ static void valueFlowInjectParameter(const TokenList& tokenlist, const Scope* functionScope, const std::unordered_map>& vars) { - const bool r = productParams(settings, vars, [&](const std::unordered_map& arg) { + const bool r = productParams(settings, vars, [&](const std::unordered_map& arg) -> void { auto a = makeMultiValueFlowAnalyzer(arg, settings); valueFlowGenericForward(const_cast(functionScope->bodyStart), functionScope->bodyEnd, @@ -5772,7 +5772,7 @@ static void valueFlowLibraryFunction(Token* tok, const std::string& returnValue, } if (returnValue.find("arg") != std::string::npos && argValues.empty()) return; - productParams(settings, argValues, [&](const std::unordered_map& arg) { + productParams(settings, argValues, [&](const std::unordered_map& arg) -> void { ValueFlow::Value value = evaluateLibraryFunction(arg, returnValue, settings, tok->isCpp()); if (value.isUninitValue()) return; @@ -5836,7 +5836,7 @@ static void valueFlowSubFunction(const TokenList& tokenlist, std::list argvalues(getFunctionArgumentValues(argtok)); // Remove non-local lifetimes - argvalues.remove_if([](const ValueFlow::Value& v) { + argvalues.remove_if([](const ValueFlow::Value& v) -> bool { if (v.isLifetimeValue()) return !v.isLocalLifetimeValue() && !v.isSubFunctionLifetimeValue(); return false; @@ -5906,7 +5906,7 @@ static const ValueFlow::Value* getKnownValueFromToken(const Token* tok) { if (!tok) return nullptr; - auto it = std::find_if(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& v) { + auto it = std::find_if(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& v) -> bool { return (v.isIntValue() || v.isContainerSizeValue() || v.isFloatValue()) && v.isKnown(); }); if (it == tok->values().end()) @@ -5922,14 +5922,14 @@ static std::vector getCommonValuesFromTokens(const std::vector std::copy_if(toks.front()->values().begin(), toks.front()->values().end(), std::back_inserter(result), - [&](const ValueFlow::Value& v) { + [&](const ValueFlow::Value& v) -> bool { if (!v.isKnown() && !v.isImpossible()) return false; return (v.isIntValue() || v.isContainerSizeValue() || v.isFloatValue()); }); - std::for_each(toks.begin() + 1, toks.end(), [&](const Token* tok) { - auto it = std::remove_if(result.begin(), result.end(), [&](const ValueFlow::Value& v) { - return std::none_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& v2) { + std::for_each(toks.begin() + 1, toks.end(), [&](const Token* tok) -> void { + auto it = std::remove_if(result.begin(), result.end(), [&](const ValueFlow::Value& v) -> bool { + return std::none_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& v2) -> bool { return v.equalValue(v2) && v.valueKind == v2.valueKind; }); }); @@ -6058,7 +6058,7 @@ static void addToErrorPath(ValueFlow::Value& value, const ValueFlow::Value& from std::transform(value.errorPath.cbegin(), value.errorPath.cend(), std::inserter(locations, locations.begin()), - [](const ErrorPathItem& e) { + [](const ErrorPathItem& e) -> const Token * { return e.first; }); if (from.condition && !value.condition) @@ -6066,7 +6066,7 @@ static void addToErrorPath(ValueFlow::Value& value, const ValueFlow::Value& from std::copy_if(from.errorPath.cbegin(), from.errorPath.cend(), std::back_inserter(value.errorPath), - [&](const ErrorPathItem& e) { + [&](const ErrorPathItem& e) -> bool { return locations.insert(e.first).second; }); } @@ -6079,7 +6079,7 @@ static std::vector findAllUsages(const Variable* var, const Scope* scope = var->scope(); if (!scope) return {}; - return findTokensSkipDeadCode(library, start, scope->bodyEnd, [&](const Token* tok) { + return findTokensSkipDeadCode(library, start, scope->bodyEnd, [&](const Token* tok) -> bool { return tok->varId() == var->declarationId(); }); } @@ -6119,7 +6119,7 @@ static Token* findStartToken(const Variable* var, Token* start, const Library& l return isLoopExpression ? start : first->previous(); } // If all uses are in the same scope - if (std::all_of(uses.begin() + 1, uses.end(), [&](const Token* tok) { + if (std::all_of(uses.begin() + 1, uses.end(), [&](const Token* tok) -> bool { return tok->scope() == scope; })) return first->previous(); @@ -6523,7 +6523,7 @@ static void valueFlowIterators(TokenList& tokenlist, const Settings& settings) static std::list getIteratorValues(std::list values, const ValueFlow::Value::ValueKind* kind = nullptr) { - values.remove_if([&](const ValueFlow::Value& v) { + values.remove_if([&](const ValueFlow::Value& v) -> bool { if (kind && v.valueKind != *kind) return true; return !v.isIteratorValue(); @@ -6568,7 +6568,7 @@ static void valueFlowIteratorInfer(TokenList& tokenlist, const Settings& setting if (!tok->scope()->isExecutable()) continue; std::list values = getIteratorValues(tok->values()); - values.remove_if([&](const ValueFlow::Value& v) { + values.remove_if([&](const ValueFlow::Value& v) -> bool { if (!v.isImpossible()) return true; if (!v.condition) @@ -6934,7 +6934,7 @@ struct ContainerConditionHandler : ConditionHandler { std::vector parse(const Token* tok, const Settings& settings) const override { std::vector conds; - parseCompareEachInt(tok, [&](const Token* vartok, ValueFlow::Value true_value, ValueFlow::Value false_value) { + parseCompareEachInt(tok, [&](const Token* vartok, ValueFlow::Value true_value, ValueFlow::Value false_value) -> void { vartok = settings.library.getContainerFromYield(vartok, Library::Container::Yield::SIZE); if (!vartok) return; @@ -7330,7 +7330,7 @@ struct ValueFlowPassRunner { bool run_once(std::initializer_list> passes) const { - return std::any_of(passes.begin(), passes.end(), [&](const ValuePtr& pass) { + return std::any_of(passes.begin(), passes.end(), [&](const ValuePtr& pass) -> bool { return run(pass); }); } @@ -7341,7 +7341,7 @@ struct ValueFlowPassRunner { std::size_t n = state.settings.vfOptions.maxIterations; while (n > 0 && values != getTotalValues()) { values = getTotalValues(); - if (std::any_of(passes.begin(), passes.end(), [&](const ValuePtr& pass) { + if (std::any_of(passes.begin(), passes.end(), [&](const ValuePtr& pass) -> bool { return run(pass); })) return true; @@ -7611,7 +7611,7 @@ static std::vector isOutOfBoundsImpl(const ValueFlow::Value& s // TODO: Use a better way to decide if the variable in unconstrained if (!indexTok->variable() || !indexTok->variable()->isArgument()) return {}; - if (std::any_of(indexTok->values().cbegin(), indexTok->values().cend(), [&](const ValueFlow::Value& v) { + if (std::any_of(indexTok->values().cbegin(), indexTok->values().cend(), [&](const ValueFlow::Value& v) -> bool { return v.isSymbolicValue() && v.isPossible() && v.bound == ValueFlow::Value::Bound::Upper; })) return {}; diff --git a/lib/vf_analyzers.cpp b/lib/vf_analyzers.cpp index 9dc01477515..4a4cdca070f 100644 --- a/lib/vf_analyzers.cpp +++ b/lib/vf_analyzers.cpp @@ -158,7 +158,7 @@ struct ValueFlowAnalyzer : Analyzer { args.push_back(tok->tokAt(-2)->astOperand1()); } ConditionState result; - result.dependent = std::any_of(args.cbegin(), args.cend(), [&](const Token* arg) { + result.dependent = std::any_of(args.cbegin(), args.cend(), [&](const Token* arg) -> bool { ConditionState cs = analyzeCondition(arg, depth - 1); return cs.dependent; }); @@ -305,7 +305,7 @@ struct ValueFlowAnalyzer : Analyzer { if (!value->isImpossible() && value->equalValue(rhsValue)) a = Action::Idempotent; if (tok->exprId() != 0 && - findAstNode(rhs, [&](const Token* child) { + findAstNode(rhs, [&](const Token* child) -> bool { return tok->exprId() == child->exprId(); })) a |= Action::Incremental; @@ -513,7 +513,7 @@ struct ValueFlowAnalyzer : Analyzer { const Token* findMatch(const Token* tok) const { - return findAstNode(tok, [&](const Token* child) { + return findAstNode(tok, [&](const Token* child) -> bool { return match(child); }); } @@ -529,7 +529,7 @@ struct ValueFlowAnalyzer : Analyzer { return false; // If the same symbolic value is already there then skip if (currValue->isSymbolicValue() && - std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) { + std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) -> bool { return v.isSymbolicValue() && currValue->equalValue(v); })) return false; @@ -649,7 +649,7 @@ struct ValueFlowAnalyzer : Analyzer { // Follow references auto refs = followAllReferences(tok); const bool inconclusiveRefs = refs.size() != 1; - if (std::none_of(refs.cbegin(), refs.cend(), [&](const ReferenceToken& ref) { + if (std::none_of(refs.cbegin(), refs.cend(), [&](const ReferenceToken& ref) -> bool { return tok == ref.token; })) refs.emplace_back(ReferenceToken{tok, {}}); @@ -695,7 +695,7 @@ struct ValueFlowAnalyzer : Analyzer { std::vector evaluateInt(const Token* tok) const { - return evaluateInt(tok, [&] { + return evaluateInt(tok, [&]() -> ProgramMemory { return ProgramMemory{getProgramState()}; }); } @@ -703,12 +703,12 @@ struct ValueFlowAnalyzer : Analyzer { std::vector evaluate(Evaluate e, const Token* tok, const Token* ctx = nullptr) const override { if (e == Evaluate::Integral) { - return evaluateInt(tok, [&] { + return evaluateInt(tok, [&]() -> ProgramMemory { return pms.get(tok, ctx, getProgramState()); }); } if (e == Evaluate::ContainerEmpty) { - const ValueFlow::Value* value = ValueFlow::findValue(tok->values(), settings, [](const ValueFlow::Value& v) { + const ValueFlow::Value* value = ValueFlow::findValue(tok->values(), settings, [](const ValueFlow::Value& v) -> bool { return v.isKnown() && v.isContainerSizeValue(); }); if (value) @@ -1025,7 +1025,7 @@ struct MultiValueFlowAnalyzer : ValueFlowAnalyzer { return true; if (!condTok->hasKnownIntValue() && values.count(condTok->varId()) == 0) { const auto& values_ = condTok->values(); - return std::any_of(values_.cbegin(), values_.cend(), [](const ValueFlow::Value& v) { + return std::any_of(values_.cbegin(), values_.cend(), [](const ValueFlow::Value& v) -> bool { return v.isSymbolicValue() && Token::Match(v.tokvalue, "%oror%|&&"); }); } @@ -1037,13 +1037,13 @@ struct MultiValueFlowAnalyzer : ValueFlowAnalyzer { if (!scope) return false; if (scope->type == ScopeType::eLambda) { - return std::all_of(values.cbegin(), values.cend(), [](const std::pair& p) { + return std::all_of(values.cbegin(), values.cend(), [](const std::pair& p) -> bool { return p.second.isLifetimeValue(); }); } if (scope->type == ScopeType::eIf || scope->type == ScopeType::eElse || scope->type == ScopeType::eWhile || scope->type == ScopeType::eFor) { - auto pred = [](const ValueFlow::Value& value) { + auto pred = [](const ValueFlow::Value& value) -> bool { if (value.isKnown()) return true; if (value.isImpossible()) @@ -1162,7 +1162,7 @@ struct SingleValueFlowAnalyzer : ValueFlowAnalyzer { bool isGlobal() const override { const auto& vars = getVars(); - return std::any_of(vars.cbegin(), vars.cend(), [] (const std::pair& p) { + return std::any_of(vars.cbegin(), vars.cend(), [] (const std::pair& p) -> bool { const Variable* var = p.second; return !var->isLocal() && !var->isArgument() && !var->isConst(); }); @@ -1266,7 +1266,7 @@ struct ExpressionAnalyzer : SingleValueFlowAnalyzer { // TODO: add bailout message return; } - visitAstNodes(start, [&](const Token* tok) { + visitAstNodes(start, [&](const Token* tok) -> ChildrenToVisit { const bool top = depth == 0 && tok == start; const bool ispointer = astIsPointer(tok) || astIsSmartPointer(tok) || astIsIterator(tok); if (!top || !ispointer || value.indirect != 0) { @@ -1480,7 +1480,7 @@ struct ContainerExpressionAnalyzer : ExpressionAnalyzer { return Action::Read | Action::Write | Action::Incremental; const Library::Container* rhsContainer = getLibraryContainer(rhs); if (rhsContainer && rhsContainer->stdStringLike) { - if (std::any_of(rhs->values().cbegin(), rhs->values().cend(), [&](const ValueFlow::Value &rhsval) { + if (std::any_of(rhs->values().cbegin(), rhs->values().cend(), [&](const ValueFlow::Value &rhsval) -> bool { return rhsval.isKnown() && rhsval.isContainerSizeValue(); })) return Action::Read | Action::Write | Action::Incremental; @@ -1515,7 +1515,7 @@ struct ContainerExpressionAnalyzer : ExpressionAnalyzer { if (rhs->tokType() == Token::eString) n = Token::getStrLength(rhs); else if (rhsContainer && rhsContainer->stdStringLike) { - auto it = std::find_if(rhs->values().begin(), rhs->values().end(), [&](const ValueFlow::Value& rhsval) { + auto it = std::find_if(rhs->values().begin(), rhs->values().end(), [&](const ValueFlow::Value& rhsval) -> bool { return rhsval.isKnown() && rhsval.isContainerSizeValue(); }); if (it != rhs->values().end()) diff --git a/lib/vf_settokenvalue.cpp b/lib/vf_settokenvalue.cpp index 1fcf7d28a3a..af45f1be734 100644 --- a/lib/vf_settokenvalue.cpp +++ b/lib/vf_settokenvalue.cpp @@ -246,7 +246,7 @@ namespace ValueFlow return; if (Token::simpleMatch(parent, ",") && !parent->isInitComma() && astIsRHS(tok)) { - const Token* callParent = findParent(parent, [](const Token* p) { + const Token* callParent = findParent(parent, [](const Token* p) -> bool { return !Token::simpleMatch(p, ","); }); // Ensure that the comma isn't a function call @@ -410,7 +410,7 @@ namespace ValueFlow nonneg int varId = 0; bool ret = false; visitAstNodes(parent->astOperand1(), - [&](const Token *t) { + [&](const Token *t) -> ChildrenToVisit { if (t->varId()) { if (varId > 0 || value.varId != 0) ret = true; @@ -526,7 +526,7 @@ namespace ValueFlow equal = std::equal(args1.begin(), args1.end(), args2.begin(), - [&](const Token* atok, const Token* btok) { + [&](const Token* atok, const Token* btok) -> bool { return atok->getKnownIntValue() == btok->getKnownIntValue(); }); diff --git a/test/helpers.h b/test/helpers.h index d62696986df..1fd7ebaace3 100644 --- a/test/helpers.h +++ b/test/helpers.h @@ -204,7 +204,7 @@ namespace cppcheck { ); */ #define dinit(T, ...) \ - ([&] { T ${}; __VA_ARGS__; return $; }()) + ([&]() -> T { T ${}; __VA_ARGS__; return $; }()) // Default construct object to avoid bug in clang // error: default member initializer for 'y' needed within definition of enclosing class 'X' outside of member functions diff --git a/test/testcppcheck.cpp b/test/testcppcheck.cpp index 37eebcc8a84..eddd11b4bcc 100644 --- a/test/testcppcheck.cpp +++ b/test/testcppcheck.cpp @@ -198,10 +198,10 @@ class TestCppcheck : public TestFixture { CppCheck cppcheck(s, supprs, errorLogger, false, f); ASSERT_EQUALS(1, cppcheck.check(FileWithDetails(file.path(), Path::identify(file.path(), false), 0))); // TODO: how to properly disable these warnings? - errorLogger.ids.erase(std::remove_if(errorLogger.ids.begin(), errorLogger.ids.end(), [](const std::string& id) { + errorLogger.ids.erase(std::remove_if(errorLogger.ids.begin(), errorLogger.ids.end(), [](const std::string& id) -> bool { return id == "logChecker"; }), errorLogger.ids.end()); - errorLogger.errmsgs.erase(std::remove_if(errorLogger.errmsgs.begin(), errorLogger.errmsgs.end(), [](const ErrorMessage& msg) { + errorLogger.errmsgs.erase(std::remove_if(errorLogger.errmsgs.begin(), errorLogger.errmsgs.end(), [](const ErrorMessage& msg) -> bool { return msg.id == "logChecker"; }), errorLogger.errmsgs.end()); if (tools) @@ -284,10 +284,10 @@ class TestCppcheck : public TestFixture { FileSettings fs{file.path(), Path::identify(file.path(), false), 0}; ASSERT_EQUALS(1, cppcheck.check(fs)); // TODO: how to properly disable these warnings? - errorLogger.ids.erase(std::remove_if(errorLogger.ids.begin(), errorLogger.ids.end(), [](const std::string& id) { + errorLogger.ids.erase(std::remove_if(errorLogger.ids.begin(), errorLogger.ids.end(), [](const std::string& id) -> bool { return id == "logChecker"; }), errorLogger.ids.end()); - errorLogger.errmsgs.erase(std::remove_if(errorLogger.errmsgs.begin(), errorLogger.errmsgs.end(), [](const ErrorMessage& msg) { + errorLogger.errmsgs.erase(std::remove_if(errorLogger.errmsgs.begin(), errorLogger.errmsgs.end(), [](const ErrorMessage& msg) -> bool { return msg.id == "logChecker"; }), errorLogger.errmsgs.end()); if (tools) @@ -352,7 +352,7 @@ class TestCppcheck : public TestFixture { CppCheck cppcheck(s, supprs, errorLogger, false, {}); ASSERT_EQUALS(0, cppcheck.check(FileWithDetails(file.path(), Path::identify(file.path(), false), 0))); // TODO: how to properly disable these warnings? - errorLogger.ids.erase(std::remove_if(errorLogger.ids.begin(), errorLogger.ids.end(), [](const std::string& id) { + errorLogger.ids.erase(std::remove_if(errorLogger.ids.begin(), errorLogger.ids.end(), [](const std::string& id) -> bool { return id == "logChecker"; }), errorLogger.ids.end()); ASSERT_EQUALS(0, errorLogger.ids.size()); @@ -379,7 +379,7 @@ class TestCppcheck : public TestFixture { ASSERT_EQUALS(1, cppcheck.check(FileWithDetails(test_file_a.path(), Path::identify(test_file_a.path(), false), 0))); ASSERT_EQUALS(1, cppcheck.check(FileWithDetails(test_file_b.path(), Path::identify(test_file_b.path(), false), 0))); // TODO: how to properly disable these warnings? - errorLogger.errmsgs.erase(std::remove_if(errorLogger.errmsgs.begin(), errorLogger.errmsgs.end(), [](const ErrorMessage& msg) { + errorLogger.errmsgs.erase(std::remove_if(errorLogger.errmsgs.begin(), errorLogger.errmsgs.end(), [](const ErrorMessage& msg) -> bool { return msg.id == "logChecker"; }), errorLogger.errmsgs.end()); // the internal errorlist is cleared after each check() call @@ -410,7 +410,7 @@ class TestCppcheck : public TestFixture { CppCheck cppcheck(s, supprs, errorLogger, false, {}); ASSERT_EQUALS(1, cppcheck.check(FileWithDetails(test_file.path(), Path::identify(test_file.path(), false), 0))); // TODO: how to properly disable these warnings? - errorLogger.errmsgs.erase(std::remove_if(errorLogger.errmsgs.begin(), errorLogger.errmsgs.end(), [](const ErrorMessage& msg) { + errorLogger.errmsgs.erase(std::remove_if(errorLogger.errmsgs.begin(), errorLogger.errmsgs.end(), [](const ErrorMessage& msg) -> bool { return msg.id == "logChecker"; }), errorLogger.errmsgs.end()); // the internal errorlist is cleared after each check() call diff --git a/test/testfilelister.cpp b/test/testfilelister.cpp index 13057735513..55bff389153 100644 --- a/test/testfilelister.cpp +++ b/test/testfilelister.cpp @@ -138,7 +138,7 @@ class TestFileLister : public TestFixture { std::string err = FileLister::recursiveAddFiles(files, basedir, {}, matcher); ASSERT_EQUALS("", err); ASSERT(!files.empty()); - const auto it = std::find_if(files.cbegin(), files.cend(), [](const FileWithDetails& f){ + const auto it = std::find_if(files.cbegin(), files.cend(), [](const FileWithDetails& f) -> bool { return f.spath().find("/lib/") != std::string::npos; }); ASSERT(it == files.cend()); diff --git a/test/testprocessexecutor.cpp b/test/testprocessexecutor.cpp index ff404f11c66..d7feb6b3806 100644 --- a/test/testprocessexecutor.cpp +++ b/test/testprocessexecutor.cpp @@ -95,7 +95,7 @@ class TestProcessExecutorBase : public TestFixture { Suppressions supprs; // NOLINTNEXTLINE(performance-unnecessary-value-param) - auto executeFn = [](std::string,std::vector,std::string,std::string&){ + auto executeFn = [](std::string,std::vector,std::string,std::string&) -> int { return EXIT_SUCCESS; }; diff --git a/test/testsingleexecutor.cpp b/test/testsingleexecutor.cpp index 25eb43ac4bc..ac6b3abfbf9 100644 --- a/test/testsingleexecutor.cpp +++ b/test/testsingleexecutor.cpp @@ -100,7 +100,7 @@ class TestSingleExecutorBase : public TestFixture { Suppressions supprs; // NOLINTNEXTLINE(performance-unnecessary-value-param) - CppCheck cppcheck(s, supprs, *this, true, [](std::string,std::vector,std::string,std::string&){ + CppCheck cppcheck(s, supprs, *this, true, [](std::string,std::vector,std::string,std::string&) -> int { return EXIT_SUCCESS; }); diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index ca23ecea050..393e3036942 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -153,7 +153,7 @@ class TestSymbolDatabase : public TestFixture { currScope = currScope->nestedIn; } while (currScope) { - auto it = std::find_if(currScope->functionList.cbegin(), currScope->functionList.cend(), [&](const Function& f) { + auto it = std::find_if(currScope->functionList.cbegin(), currScope->functionList.cend(), [&](const Function& f) -> bool { return f.tokenDef->str() == str; }); if (it != currScope->functionList.end()) @@ -3144,7 +3144,7 @@ class TestSymbolDatabase : public TestFixture { "namespace barney { X::X(int) { } }"); // Locate the scope for the class.. - auto it = std::find_if(db->scopeList.cbegin(), db->scopeList.cend(), [](const Scope& s) { + auto it = std::find_if(db->scopeList.cbegin(), db->scopeList.cend(), [](const Scope& s) -> bool { return s.isClassOrStruct(); }); const Scope *scope = (it == db->scopeList.end()) ? nullptr : &*it; @@ -3175,7 +3175,7 @@ class TestSymbolDatabase : public TestFixture { "}"); // Locate the scope for the class.. - auto it = std::find_if(db->scopeList.cbegin(), db->scopeList.cend(), [](const Scope& s) { + auto it = std::find_if(db->scopeList.cbegin(), db->scopeList.cend(), [](const Scope& s) -> bool { return s.isClassOrStruct(); }); const Scope* scope = (it == db->scopeList.end()) ? nullptr : &*it; @@ -3512,7 +3512,7 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS(4U, db->scopeList.size()); // Find the scope for the Fred struct.. - auto it = std::find_if(db->scopeList.cbegin(), db->scopeList.cend(), [&](const Scope& scope) { + auto it = std::find_if(db->scopeList.cbegin(), db->scopeList.cend(), [&](const Scope& scope) -> bool { return scope.isClassOrStruct() && scope.className == "Fred"; }); const Scope* fredScope = (it == db->scopeList.end()) ? nullptr : &*it; @@ -5533,7 +5533,7 @@ class TestSymbolDatabase : public TestFixture { "}\n"); ASSERT(db); ASSERT_EQUALS(1, db->functionScopes.size()); - auto it = std::find_if(db->scopeList.cbegin(), db->scopeList.cend(), [](const Scope& s) { + auto it = std::find_if(db->scopeList.cbegin(), db->scopeList.cend(), [](const Scope& s) -> bool { return s.className == "T"; }); ASSERT(it != db->scopeList.end()); @@ -5555,7 +5555,7 @@ class TestSymbolDatabase : public TestFixture { "}\n"); ASSERT(db); ASSERT_EQUALS(1, db->functionScopes.size()); - auto it = std::find_if(db->scopeList.cbegin(), db->scopeList.cend(), [](const Scope& s) { + auto it = std::find_if(db->scopeList.cbegin(), db->scopeList.cend(), [](const Scope& s) -> bool { return s.className == "A"; }); ASSERT(it != db->scopeList.end()); @@ -5578,7 +5578,7 @@ class TestSymbolDatabase : public TestFixture { "void A::f(N::O::B*) {}\n"); ASSERT(db); ASSERT_EQUALS(1, db->functionScopes.size()); - auto it = std::find_if(db->scopeList.cbegin(), db->scopeList.cend(), [](const Scope& s) { + auto it = std::find_if(db->scopeList.cbegin(), db->scopeList.cend(), [](const Scope& s) -> bool { return s.className == "A"; }); ASSERT(it != db->scopeList.end()); @@ -5881,7 +5881,7 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS(1, db->scopeList.front().varlist.size()); auto list = db->scopeList; list.pop_front(); - ASSERT_EQUALS(true, std::all_of(list.cbegin(), list.cend(), [](const Scope& scope) { + ASSERT_EQUALS(true, std::all_of(list.cbegin(), list.cend(), [](const Scope& scope) -> bool { return scope.varlist.empty(); })); } diff --git a/test/testthreadexecutor.cpp b/test/testthreadexecutor.cpp index d96e219153a..11c41739ee0 100644 --- a/test/testthreadexecutor.cpp +++ b/test/testthreadexecutor.cpp @@ -96,7 +96,7 @@ class TestThreadExecutorBase : public TestFixture { Suppressions supprs; // NOLINTNEXTLINE(performance-unnecessary-value-param) - auto executeFn = [](std::string,std::vector,std::string,std::string&){ + auto executeFn = [](std::string,std::vector,std::string,std::string&) -> int { return EXIT_SUCCESS; }; diff --git a/test/testtoken.cpp b/test/testtoken.cpp index 04a32a81dac..dd936cf35ef 100644 --- a/test/testtoken.cpp +++ b/test/testtoken.cpp @@ -827,7 +827,7 @@ class TestToken : public TestFixture { append_vector(test_ops, logicalOps); append_vector(test_ops, assignmentOps); - ASSERT_EQUALS(true, std::all_of(test_ops.cbegin(), test_ops.cend(), [&](const std::string& s) { + ASSERT_EQUALS(true, std::all_of(test_ops.cbegin(), test_ops.cend(), [&](const std::string& s) -> bool { return MatchCheck(s, "%op%"); })); @@ -847,7 +847,7 @@ class TestToken : public TestFixture { append_vector(test_ops, comparisonOps); append_vector(test_ops, logicalOps); - ASSERT_EQUALS(true, std::all_of(test_ops.cbegin(), test_ops.cend(), [&](const std::string& s) { + ASSERT_EQUALS(true, std::all_of(test_ops.cbegin(), test_ops.cend(), [&](const std::string& s) -> bool { return MatchCheck(s, "%cop%"); })); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index b6abf31b424..6839f236ecd 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -8200,7 +8200,7 @@ class TestTokenizer : public TestFixture { void cpp11init() { #define testIsCpp11init(...) testIsCpp11init_(__FILE__, __LINE__, __VA_ARGS__) - auto testIsCpp11init_ = [this](const char* file, int line, const char* code, const char* find, TokenImpl::Cpp11init expected) { + auto testIsCpp11init_ = [this](const char* file, int line, const char* code, const char* find, TokenImpl::Cpp11init expected) -> void { SimpleTokenizer tokenizer(settingsDefault, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); diff --git a/test/testtokenrange.cpp b/test/testtokenrange.cpp index e27e6c5b038..248b30a44a5 100644 --- a/test/testtokenrange.cpp +++ b/test/testtokenrange.cpp @@ -44,7 +44,7 @@ class TestTokenRange : public TestFixture { } static std::string testTokenRange(ConstTokenRange range, const Token* start, const Token* end) { - auto tokenToString = [](const Token* t) { + auto tokenToString = [](const Token* t) -> std::string { return t ? t->str() : ""; }; int index = 0; @@ -113,16 +113,16 @@ class TestTokenRange : public TestFixture { const char code[] = "void a(){} void main(){ if(true){a();} }"; const SimpleTokenList tokenList(code); ConstTokenRange range{ tokenList.front(), nullptr }; - ASSERT_EQUALS(true, std::all_of(range.begin(), range.end(), [](const Token*) { + ASSERT_EQUALS(true, std::all_of(range.begin(), range.end(), [](const Token*) -> bool { return true; })); - ASSERT_EQUALS(true, std::any_of(range.begin(), range.end(), [](const Token* t) { + ASSERT_EQUALS(true, std::any_of(range.begin(), range.end(), [](const Token* t) -> bool { return t->str() == "true"; })); - ASSERT_EQUALS("true", (*std::find_if(range.begin(), range.end(), [](const Token* t) { + ASSERT_EQUALS("true", (*std::find_if(range.begin(), range.end(), [](const Token* t) -> bool { return t->str() == "true"; }))->str()); - ASSERT_EQUALS(3, std::count_if(range.begin(), range.end(), [](const Token* t) { + ASSERT_EQUALS(3, std::count_if(range.begin(), range.end(), [](const Token* t) -> bool { return t->str() == "{"; })); } diff --git a/test/testutils.cpp b/test/testutils.cpp index 791aadb322d..28305a73578 100644 --- a/test/testutils.cpp +++ b/test/testutils.cpp @@ -551,11 +551,11 @@ class TestUtils : public TestFixture { void memoize() const { int count = 0; - auto f = [&count]() { + auto f = [&count]() -> int { ++count; return count; }; - const auto callF = utils::memoize([&]() { + const auto callF = utils::memoize([&]() -> int { return f(); }); ASSERT_EQUALS(0, count); diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 7a19a92786b..dd40352888c 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -217,7 +217,7 @@ class TestValueFlow : public TestFixture { for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) { if (tok->str() == "x" && tok->linenr() == linenr) { - if (std::any_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& val) { + if (std::any_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& val) -> bool { if (val.isSymbolicValue()) return false; if (val.isKnown() && val.intvalue == value) @@ -238,7 +238,7 @@ class TestValueFlow : public TestFixture { for (const Token* tok = tokenizer.tokens(); tok; tok = tok->next()) { if (tok->str() == "x" && tok->linenr() == linenr) { - if (std::any_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& val) { + if (std::any_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& val) -> bool { if (!val.isSymbolicValue()) return false; if (val.isKnown() && val.intvalue == value && val.tokvalue->expressionString() == expr) @@ -260,7 +260,7 @@ class TestValueFlow : public TestFixture { for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) { if (tok->str() == "x" && tok->linenr() == linenr) { - if (std::any_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& val) { + if (std::any_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& val) -> bool { if (val.isSymbolicValue()) return false; if (val.isImpossible() && val.intvalue == value) @@ -282,7 +282,7 @@ class TestValueFlow : public TestFixture { for (const Token* tok = tokenizer.tokens(); tok; tok = tok->next()) { if (tok->str() == "x" && tok->linenr() == linenr) { - if (std::any_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& val) { + if (std::any_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& val) -> bool { if (!val.isSymbolicValue()) return false; if (val.isImpossible() && val.intvalue == value && val.tokvalue->expressionString() == expr) @@ -304,7 +304,7 @@ class TestValueFlow : public TestFixture { for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) { if (tok->str() == "x" && tok->linenr() == linenr) { - if (std::any_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& val) { + if (std::any_of(tok->values().begin(), tok->values().end(), [&](const ValueFlow::Value& val) -> bool { if (val.isSymbolicValue()) return false; if (val.isInconclusive() && val.intvalue == value) @@ -328,7 +328,7 @@ class TestValueFlow : public TestFixture { for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) { if (tok->str() == "x" && tok->linenr() == linenr) { - if (std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) { + if (std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) -> bool { return v.isIntValue() && !v.isImpossible() && v.intvalue == value; })) return true; @@ -346,7 +346,7 @@ class TestValueFlow : public TestFixture { for (const Token* tok = tokenizer.tokens(); tok; tok = tok->next()) { if (tok->str() == "x" && tok->linenr() == linenr) { - if (std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) { + if (std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) -> bool { return v.isSymbolicValue() && !v.isImpossible() && v.intvalue == value && v.tokvalue->expressionString() == expr; })) return true; @@ -363,7 +363,7 @@ class TestValueFlow : public TestFixture { for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) { if (tok->str() == "x" && tok->linenr() == linenr) { - if (std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) { + if (std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) -> bool { return v.isFloatValue() && !v.isImpossible() && v.floatValue >= value - diff && v.floatValue <= value + diff; })) return true; @@ -405,7 +405,7 @@ class TestValueFlow : public TestFixture { const std::size_t len = strlen(value); for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) { if (tok->str() == "x" && tok->linenr() == linenr) { - if (std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) { + if (std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) -> bool { return v.valueType == type && Token::simpleMatch(v.tokvalue, value, len); })) return true; @@ -442,7 +442,7 @@ class TestValueFlow : public TestFixture { for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) { if (tok->str() == "x" && tok->linenr() == linenr) { - if (std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) { + if (std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) -> bool { return v.valueType == type && v.intvalue == value; })) return true; @@ -459,7 +459,7 @@ class TestValueFlow : public TestFixture { for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) { if (tok->str() == "x" && tok->linenr() == linenr) { - if (std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) { + if (std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) -> bool { return v.isMovedValue() && v.moveKind == moveKind; })) return true; @@ -509,7 +509,7 @@ class TestValueFlow : public TestFixture { std::list tokenValues_(const char* file, int line, const char code[], const char tokstr[], ValueFlow::Value::ValueType vt, const Settings *s = nullptr) { std::list values = tokenValues_(file, line, code, tokstr, s); - values.remove_if([&](const ValueFlow::Value& v) { + values.remove_if([&](const ValueFlow::Value& v) -> bool { return v.valueType != vt; }); return values; @@ -550,14 +550,14 @@ class TestValueFlow : public TestFixture { bool cpp = true) { std::list values = removeImpossible(tokenValues_(file, line, code, tokstr, s, cpp)); - return std::any_of(values.begin(), values.end(), [&](const ValueFlow::Value& v) { + return std::any_of(values.begin(), values.end(), [&](const ValueFlow::Value& v) -> bool { return v.isKnown() && v.isIntValue() && v.intvalue == value; }); } static std::list removeSymbolicTok(std::list values) { - values.remove_if([](const ValueFlow::Value& v) { + values.remove_if([](const ValueFlow::Value& v) -> bool { return v.isSymbolicValue() || v.isTokValue(); }); return values; @@ -4447,7 +4447,7 @@ class TestValueFlow : public TestFixture { " for (s.x = 0; s.x < 127; s.x++) {}\n" "}"; values = removeImpossible(tokenValues(code, "<")); - values.remove_if([&](const ValueFlow::Value& v) { + values.remove_if([&](const ValueFlow::Value& v) -> bool { return !v.isKnown(); }); ASSERT_EQUALS(true, values.empty()); @@ -5233,7 +5233,7 @@ class TestValueFlow : public TestFixture { bool isNotKnownValues(const char code[], const char str[]) { const auto& values = tokenValues(code, str); - return std::none_of(values.cbegin(), values.cend(), [](const ValueFlow::Value& v) { + return std::none_of(values.cbegin(), values.cend(), [](const ValueFlow::Value& v) -> bool { return v.isKnown(); }); } @@ -7494,7 +7494,7 @@ class TestValueFlow : public TestFixture { " return x + 0;\n" "}"; values = removeSymbolicTok(tokenValues(code, "+", &s)); - values.remove_if([](const ValueFlow::Value& v) { + values.remove_if([](const ValueFlow::Value& v) -> bool { return v.isImpossible(); }); ASSERT_EQUALS(2, values.size()); diff --git a/tools/dmake/dmake.cpp b/tools/dmake/dmake.cpp index e5748ebf389..3f39d99e27a 100644 --- a/tools/dmake/dmake.cpp +++ b/tools/dmake/dmake.cpp @@ -290,7 +290,7 @@ static std::vector prioritizelib(const std::vector& li priorities["lib/tokenize.cpp"] = 900; priorities["lib/symboldatabase.cpp"] = 800; std::vector libfiles_prio = libfiles; - std::sort(libfiles_prio.begin(), libfiles_prio.end(), [&](const std::string &l1, const std::string &l2) { + std::sort(libfiles_prio.begin(), libfiles_prio.end(), [&](const std::string &l1, const std::string &l2) -> bool { const auto p1 = priorities.find(l1); const auto p2 = priorities.find(l2); return (p1 != priorities.end() ? p1->second : 0) > (p2 != priorities.end() ? p2->second : 0); @@ -515,7 +515,7 @@ int main(int argc, char **argv) // TODO: write filter files // Visual Studio projects - write_vcxproj("cli/cli.vcxproj", [&](std::string &outstr){ + write_vcxproj("cli/cli.vcxproj", [&](std::string &outstr) -> void { for (const std::string &clifile: clifiles) { const std::string c = clifile.substr(4); outstr += make_vcxproj_cl_entry(c, c == "executor.cpp" ? Precompile : Compile); @@ -524,7 +524,7 @@ int main(int argc, char **argv) const std::string c = "..\\frontend\\" + frontendfile.substr(9); outstr += make_vcxproj_cl_entry(c, Compile); } - }, [&](std::string &outstr){ + }, [&](std::string &outstr) -> void { for (const std::string &clifile_h: clifiles_h) { outstr += make_vcxproj_cl_entry(clifile_h, Include); } @@ -542,7 +542,7 @@ int main(int argc, char **argv) const std::string l = libfile.substr(4); outstr += make_vcxproj_cl_entry(l, l == "check.cpp" ? Precompile : Compile); } - }, [&](std::string &outstr){ + }, [&](std::string &outstr) -> void { outstr += make_vcxproj_cl_entry(R"(..\externals\simplecpp\simplecpp.h)", Include); outstr += make_vcxproj_cl_entry(R"(..\externals\tinyxml2\tinyxml2.h)", Include); @@ -551,7 +551,7 @@ int main(int argc, char **argv) } }); - write_vcxproj("test/testrunner.vcxproj", [&](std::string &outstr){ + write_vcxproj("test/testrunner.vcxproj", [&](std::string &outstr) -> void { for (const std::string &clifile: clifiles) { if (clifile == "cli/main.cpp") continue; @@ -568,7 +568,7 @@ int main(int argc, char **argv) const std::string t = testfile.substr(5); outstr += make_vcxproj_cl_entry(t, t == "fixture.cpp" ? Precompile : Compile); } - }, [&](std::string &outstr){ + }, [&](std::string &outstr) -> void { for (const std::string &clifile_h: clifiles_h) { const std::string c = R"(..\cli\)" + clifile_h; outstr += make_vcxproj_cl_entry(c, Include);