diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml new file mode 100644 index 00000000..a59c2b9f --- /dev/null +++ b/.github/codeql/codeql-config.yml @@ -0,0 +1,15 @@ +name: "CodeQL config" + +queries: + - uses: security-and-quality + +query-filters: + - exclude: + id: cpp/include-non-header + - exclude: + id: cpp/undisciplined-multiple-inheritance + - exclude: + id: cpp/unused-static-variable + - exclude: + id: cpp/missing-return + \ No newline at end of file diff --git a/.github/workflows/analysis.yml b/.github/workflows/analysis.yml index a89c06d4..1c39892c 100644 --- a/.github/workflows/analysis.yml +++ b/.github/workflows/analysis.yml @@ -6,8 +6,6 @@ jobs: core-guidelines: name: core-guidelines-check runs-on: windows-2022 - # Disabled because of an internal compiler error in reference_lines.cpp - if: false defaults: run: @@ -37,18 +35,17 @@ jobs: ############################################################################################################# clang-analyzers: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: matrix: tool: [ - { name: iwyu, cmake-flag: CMAKE_CXX_INCLUDE_WHAT_YOU_USE="iwyu;-Xiwyu;--mapping_file=../.iwyu-mappings" }, { name: clang-tidy, cmake-flag: CMAKE_CXX_CLANG_TIDY="clang-tidy" }, { name: cppcheck, cmake-flag: CMAKE_CXX_CPPCHECK="cppcheck;--version;--verbose;--report-progress;--enable=all;--error-exitcode=1;--std=c++20;--suppressions-list=../.cppcheck-supressions" } ] include: - - pkgs: clang-15 clang-tools-15 clang-tidy-15 iwyu cppcheck - cxx: clang++-15 + - pkgs: clang-18 clang-tools-18 clang-tidy-18 iwyu cppcheck + cxx: clang++-18 defaults: run: @@ -79,13 +76,13 @@ jobs: ############################################################################################################# codeql: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: matrix: include: - - pkgs: clang-15 - cxx: clang++-15 + - pkgs: clang-18 + cxx: clang++-18 name: codeql @@ -104,7 +101,7 @@ jobs: uses: github/codeql-action/init@v3 with: languages: cpp - queries: security-and-quality + config-file: ${{ github.workspace }}/.github/codeql/codeql-config.yml - name: setup-build env: diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 5f09b76b..f8040fd4 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -6,7 +6,7 @@ on: jobs: update-docs: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 defaults: run: working-directory: ${{ github.workspace }} diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 586036ea..9333bd8b 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -4,17 +4,23 @@ on: [push, pull_request] jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 + container: + image: ubuntu:24.04 strategy: fail-fast: false matrix: + common-pkgs: [ git cmake ] build-type: [ Release, RelWithDebInfo ] compiler: [ { cxx: g++-11, pkgs: g++-11 }, { cxx: g++-12, pkgs: g++-12 }, { cxx: g++-13, pkgs: g++-13 }, - { cxx: clang++-14, pkgs: clang-14 libstdc++6=12.3.0-1ubuntu1~22.04 libgcc-s1=12.3.0-1ubuntu1~22.04 }, + { cxx: g++-14, pkgs: g++-14 }, { cxx: clang++-15, pkgs: clang-15 }, + { cxx: clang++-16, pkgs: clang-16 }, + { cxx: clang++-17, pkgs: clang-17 }, + { cxx: clang++-18, pkgs: clang-18 }, ] defaults: @@ -28,17 +34,17 @@ jobs: uses: actions/checkout@v4 - name: setup-compiler - run: sudo apt update && sudo apt install --allow-downgrades -y ${{ matrix.compiler.pkgs }} + run: apt update && apt install --allow-downgrades -y ${{ matrix.common-pkgs }} ${{ matrix.compiler.pkgs }} - name: setup-catch env: CXX: ${{ matrix.compiler.cxx }} - run: sudo bash ../tools/install_catch.sh + run: bash ../tools/install_catch.sh - name: setup-build env: CXX: ${{ matrix.compiler.cxx }} - run: cmake .. -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} -DGAPP_USE_WERROR=ON -DGAPP_USE_LTO=ON + run: cmake .. -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} -DGAPP_USE_WERROR=ON -DGAPP_USE_LTO=ON -DGAPP_CXX_FLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -D_GLIBCXX_ASSERTIONS" - name: build run: cmake --build . --parallel 8 @@ -47,4 +53,4 @@ jobs: run: ctest --output-on-failure --schedule-random - name: install - run: sudo cmake --install . + run: cmake --install . diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index d3f21f2b..2645e999 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -4,7 +4,7 @@ on: [push, pull_request] jobs: build: - runs-on: macos-13 + runs-on: macos-14 strategy: fail-fast: false matrix: @@ -12,18 +12,37 @@ jobs: compiler: [ { cxx: g++-11, pkgs: gcc@11, extra-flags: "-undefined dynamic_lookup" }, { cxx: g++-12, pkgs: gcc@12, extra-flags: "-undefined dynamic_lookup" }, - { cxx: g++-13, pkgs: gcc@13, extra-flags: "-undefined dynamic_lookup -Wno-array-bounds -Wno-stringop-overflow -Wno-stringop-overread" }, + { cxx: g++-13, pkgs: gcc@13, extra-flags: "-undefined dynamic_lookup" }, + { cxx: g++-14, pkgs: gcc@14, extra-flags: "-undefined dynamic_lookup" }, { cxx: $(brew --prefix llvm@14)/bin/clang++, pkgs: llvm@14 gcc@11, - extra-flags: "-femulated-tls -stdlib=libstdc++ -stdlib++-isystem $(brew --prefix gcc@11)/include/c++/11 -cxx-isystem $(brew --prefix gcc@11)/include/c++/11/x86_64-apple-darwin22", + extra-flags: "-femulated-tls -stdlib=libstdc++ -stdlib++-isystem $(brew --prefix gcc@11)/include/c++/11 -cxx-isystem $(brew --prefix gcc@11)/include/c++/11/aarch64-apple-darwin23", linker-flags: "-L$(brew --prefix gcc@11)/lib/gcc/11" }, { cxx: $(brew --prefix llvm@15)/bin/clang++, pkgs: llvm@15 gcc@12, - extra-flags: "-femulated-tls -stdlib=libstdc++ -stdlib++-isystem $(brew --prefix gcc@12)/include/c++/12 -cxx-isystem $(brew --prefix gcc@12)/include/c++/12/x86_64-apple-darwin22", + extra-flags: "-femulated-tls -stdlib=libstdc++ -stdlib++-isystem $(brew --prefix gcc@12)/include/c++/12 -cxx-isystem $(brew --prefix gcc@12)/include/c++/12/aarch64-apple-darwin23", linker-flags: "-L$(brew --prefix gcc@12)/lib/gcc/12" + }, + { + cxx: $(brew --prefix llvm@16)/bin/clang++, + pkgs: llvm@16 gcc@13, + extra-flags: "-femulated-tls -stdlib=libstdc++ -stdlib++-isystem $(brew --prefix gcc@13)/include/c++/13 -cxx-isystem $(brew --prefix gcc@13)/include/c++/13/aarch64-apple-darwin23", + linker-flags: "-L$(brew --prefix gcc@13)/lib/gcc/13" + }, + { + cxx: $(brew --prefix llvm@17)/bin/clang++, + pkgs: llvm@17 gcc@14, + extra-flags: "-femulated-tls -stdlib=libstdc++ -stdlib++-isystem $(brew --prefix gcc@14)/include/c++/14 -cxx-isystem $(brew --prefix gcc@14)/include/c++/14/aarch64-apple-darwin23", + linker-flags: "-L$(brew --prefix gcc@14)/lib/gcc/14" + }, + { + cxx: $(brew --prefix llvm@18)/bin/clang++, + pkgs: llvm@18 gcc@14, + extra-flags: "-femulated-tls -stdlib=libstdc++ -stdlib++-isystem $(brew --prefix gcc@14)/include/c++/14 -cxx-isystem $(brew --prefix gcc@14)/include/c++/14/aarch64-apple-darwin23", + linker-flags: "-L$(brew --prefix gcc@14)/lib/gcc/14" } ] @@ -40,14 +59,17 @@ jobs: - name: setup-compiler run: brew update && brew install ${{ matrix.compiler.pkgs }} - - name: setup-xcode - run: sudo xcode-select -switch /Applications/Xcode_15.1.app + - name: dummy step + run: ls /Applications/ + + #- name: setup-xcode + # run: sudo xcode-select -switch /Applications/Xcode_15.1.app - name: setup-catch run: sudo bash ../tools/install_catch.sh -DCMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} -DCMAKE_CXX_FLAGS="${{ matrix.compiler.extra-flags }}" -DCMAKE_EXE_LINKER_FLAGS="${{ matrix.compiler.linker-flags }}" - name: setup-build - run: cmake .. -DCMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} -DGAPP_CXX_FLAGS="${{ matrix.compiler.extra-flags }}" -DCMAKE_EXE_LINKER_FLAGS="${{ matrix.compiler.linker-flags }}" -DGAPP_USE_WERROR=ON + run: cmake .. -DCMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} -DGAPP_CXX_FLAGS="${{ matrix.compiler.extra-flags }} -v" -DCMAKE_EXE_LINKER_FLAGS="${{ matrix.compiler.linker-flags }}" -DGAPP_USE_WERROR=ON - name: build run: cmake --build . --parallel 8 diff --git a/.github/workflows/sanitizers.yml b/.github/workflows/sanitizers.yml index 81321b9d..247069a4 100644 --- a/.github/workflows/sanitizers.yml +++ b/.github/workflows/sanitizers.yml @@ -4,14 +4,14 @@ on: [push, pull_request] jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: sanitizer: [ address, undefined, thread ] include: - - cxx: clang++-15 - pkgs: clang-15 llvm-15 + - cxx: clang++-18 + pkgs: clang-18 llvm-18 env: ASAN_OPTIONS: check_initialization_order=1:strict_init_order=1:detect_stack_use_after_return=1:detect_leaks=1 diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 71bb122d..76231d0b 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -11,7 +11,10 @@ jobs: build-type: [ Release, RelWithDebInfo ] platform: [ x64, Win32 ] generator: [ "Visual Studio 17 2022" ] - compiler: [ v143, ClangCL ] + compiler: [ + { name: msvc, toolset: v143 }, + { name: clang, toolset: ClangCL } + ] build-shared: [ "ON", "OFF" ] exclude: - platform: Win32 @@ -23,7 +26,7 @@ jobs: run: working-directory: ${{ github.workspace }}/build - name: ${{ matrix.compiler }}-${{ matrix.platform }}, ${{ matrix.build-type }}, Shared=${{ matrix.build-shared }} + name: ${{ matrix.compiler.name }}-${{ matrix.platform }}, ${{ matrix.build-type }}, Shared=${{ matrix.build-shared }} steps: @@ -36,14 +39,14 @@ jobs: - name: setup-catch env: CMAKE_GENERATOR: ${{ matrix.generator }} - CMAKE_GENERATOR_TOOLSET: ${{ matrix.compiler }} + CMAKE_GENERATOR_TOOLSET: ${{ matrix.compiler.toolset }} CMAKE_GENERATOR_PLATFORM: ${{ matrix.platform }} run: bash ../tools/install_catch.sh - name: setup-build env: CMAKE_GENERATOR: ${{ matrix.generator }} - CMAKE_GENERATOR_TOOLSET: ${{ matrix.compiler }} + CMAKE_GENERATOR_TOOLSET: ${{ matrix.compiler.toolset }} CMAKE_GENERATOR_PLATFORM: ${{ matrix.platform }} run: cmake .. -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} -DBUILD_SHARED_LIBS=${{ matrix.build-shared }} -DGAPP_USE_WERROR=ON -DGAPP_USE_LTO=ON diff --git a/.iwyu-mappings b/.iwyu-mappings deleted file mode 100644 index fea62999..00000000 --- a/.iwyu-mappings +++ /dev/null @@ -1,26 +0,0 @@ -# Mapping file for include-what-you-use -# See: https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUMappings.md - -[ - # Map C headers to their C++ counterparts - { include: [ "", public, "", public ] }, - { include: [ "", public, "", public ] }, - { include: [ "", public, "", public ] }, - { include: [ "", public, "", public ] }, - - # iwyu wants to include whenever something allocates memory - { symbol: ["std::bad_alloc", "private", "", "public" ] }, - - # Fix incorrectly suggested private header includes - { include: ["", "private", "", "public" ] }, - { include: ["", "private", "", "public" ] }, - { include: ["", "private", "", "public" ] }, - { symbol: ["std::tuple_element::type", "private", "", "public" ] }, - { symbol: ["__alloc_traits::value_type", "private", "", "public" ] }, - { symbol: ["abs", "private", "", "public" ] }, - { symbol: ["allocator_traits::value_type", "private", "", "public" ] }, - - # Fix unrecognized symbols - { symbol: [ "std::floating_point", "public", "", "public" ] }, - { symbol: [ "std::is_final", "public", "", "public" ] }, -] \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index d6e7242f..23f095fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,7 +100,8 @@ else() # GNU style compiler interface # gcc specific options if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") - set(GAPP_WARN_FLAGS "${GAPP_WARN_FLAGS} -Wlogical-op") + # -Warray-bounds, -Wstringop-overflow, -Wstringop-overread are regular false positives since g++-12 + set(GAPP_WARN_FLAGS "${GAPP_WARN_FLAGS} -Wlogical-op -Wno-array-bounds -Wno-stringop-overflow -Wno-stringop-overread") endif() # clang specific options if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -108,7 +109,7 @@ else() # GNU style compiler interface endif() set(CMAKE_CXX_FLAGS "${GAPP_CXX_FLAGS} ${GAPP_WARN_FLAGS}") - set(CMAKE_CXX_FLAGS_DEBUG "-Og") + set(CMAKE_CXX_FLAGS_DEBUG "-Og -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -D_GLIBCXX_ASSERTIONS") set(CMAKE_CXX_FLAGS_RELEASE "-g -DNDEBUG ${GAPP_OPT_FLAGS}") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-g ${GAPP_OPT_FLAGS}") endif() diff --git a/CMakeSettings.json b/CMakeSettings.json index 753dee08..e58d6afd 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -103,7 +103,8 @@ "variables": [ { "name": "CMAKE_CXX_CLANG_TIDY", - "value": "clang-tidy" + "value": "clang-tidy", + "type": "STRING" } ] }, diff --git a/README.md b/README.md index 9dc027cc..5d916d23 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ The maximum of sin(x) in [0.0, 3.14] is at x = 1.57079 The following are needed for building and using the library: -- C++20 compiler (gcc 11.0, clang 14.0, msvc 14.30 or later) +- C++20 compiler (gcc 11.0, clang 15.0, msvc 14.30 or later) - CMake 3.21 or later - Catch2 3.3 or later (optional, only needed for the tests) diff --git a/core-guidelines.ruleset b/core-guidelines.ruleset index ebf549bb..14d6c680 100644 --- a/core-guidelines.ruleset +++ b/core-guidelines.ruleset @@ -24,9 +24,11 @@ - + - + + + diff --git a/docs/install-guide.md b/docs/install-guide.md index 16412195..599eabe3 100644 --- a/docs/install-guide.md +++ b/docs/install-guide.md @@ -16,7 +16,7 @@ is needed to build the tests. The full list of requirements are: -- C++20 compiler (gcc 11.0, clang 14.0, msvc 14.30 or later) +- C++20 compiler (gcc 11.0, clang 15.0, msvc 14.30 or later) - CMake 3.21 or later - Catch2 3.3 or later (optional, only needed for the tests) diff --git a/src/algorithm/soga_selection.cpp b/src/algorithm/soga_selection.cpp index a0dbc3ab..61caa5cc 100644 --- a/src/algorithm/soga_selection.cpp +++ b/src/algorithm/soga_selection.cpp @@ -152,9 +152,9 @@ namespace gapp::selection const double temperature = temperature_(ga.generation_cntr(), ga.max_gen()); // can't capture the iterators by ref or value here - std::transform(fvec.begin(), fvec.end(), fvec.begin(), [&, fmin = *fmin](double f) noexcept + std::transform(fvec.begin(), fvec.end(), fvec.begin(), [&, f_min = *fmin](double f) noexcept { - const double fnorm = f / df - fmin / df; // normalize the fitness values to prevent overflows with std::exp + const double fnorm = f / df - f_min / df; // normalize the fitness values to prevent overflows with std::exp return std::min(math::large, std::exp(fnorm / temperature)); }); diff --git a/src/utility/utility.hpp b/src/utility/utility.hpp index 6084a2b9..9046aca0 100644 --- a/src/utility/utility.hpp +++ b/src/utility/utility.hpp @@ -77,10 +77,12 @@ #endif -#if defined(__GNUC__) || defined(__clang__) +#if (defined(__GNUC__) || defined(__clang__)) && (defined(__x86_64__) || defined(__i386__)) # define GAPP_PAUSE() __builtin_ia32_pause() -#elif defined(_MSC_VER) +#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) # define GAPP_PAUSE() _mm_pause() +#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64)) +# define GAPP_PAUSE() __yield() #else # define GAPP_PAUSE() #endif