Commit dde7cb06 authored by Ramon Nou's avatar Ramon Nou
Browse files

ci: add sanitizer static analysis and ABI checks

parent 37283a16
Loading
Loading
Loading
Loading

.clang-tidy

0 → 100644
+4 −0
Original line number Diff line number Diff line
Checks: '-*,clang-analyzer-*'
WarningsAsErrors: ''
HeaderFilterRegex: '(^|/)(src|include)/'
FormatStyle: none
 No newline at end of file
+51 −0
Original line number Diff line number Diff line
@@ -666,6 +666,57 @@ cppcheck:
      codequality: cppcheck2.json
    expire_in: 5 days

static-analysis:
  stage: report
  image: ${TESTING}
  needs: [gkfs]
  script:
    - cd ${CI_PROJECT_DIR}
    - ${SCRIPTS_DIR}/check_static_analysis.sh --cppcheck --require-tools
          --build-dir ${BUILD_PATH} --output-dir analysis
    - ${SCRIPTS_DIR}/check_static_analysis.sh --clang-tidy --require-tools
          --build-dir ${BUILD_PATH} --output-dir analysis
          --clang-tidy-files
          src/common/rpc/distributor.cpp
          src/common/rpc/distributor_factory.cpp
          src/common/rpc/distribution_config.cpp
          src/daemon/classes/fs_data.cpp
          src/daemon/handler/srv_malleability.cpp
          src/client/rpc/forward_malleability.cpp
  artifacts:
    when: always
    paths:
      - analysis
    expire_in: 5 days

abi:
  stage: report
  image: ${TESTING}
  needs: [gkfs]
  script:
    - cd ${CI_PROJECT_DIR}
    - ${SCRIPTS_DIR}/check_abi.sh --build-dir ${BUILD_PATH}
  artifacts:
    when: always
    paths:
      - abi
    expire_in: 5 days

sanitizers:
  stage: report
  image: ${DEPS}
  needs: []
  parallel:
    matrix:
      - SANITIZER: [asan, ubsan, tsan]
  script:
    - cd ${CI_PROJECT_DIR}
    - cmake --preset ci-${SANITIZER}
    - cmake --build ${CI_PROJECT_DIR}/gkfs/build-${SANITIZER}
          --target unit_tests --parallel $(nproc)
    - ctest --test-dir ${CI_PROJECT_DIR}/gkfs/build-${SANITIZER}
          --output-on-failure -L unit::all


################################################################################
## Deployment of documentation and reports
+2 −0
Original line number Diff line number Diff line
@@ -234,11 +234,13 @@ find_package(Threads REQUIRED)
# details transparently
find_package(Filesystem REQUIRED)

if (GKFS_BUILD_FUSE)
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(FUSE3 REQUIRED fuse3)
    include_directories(${FUSE3_INCLUDE_DIRS})
    link_directories(${FUSE3_LIBRARY_DIRS})
    add_definitions(${FUSE3_CFLAGS_OTHER})
endif ()

# Search for 'source-only' dependencies
###############################################################################
+105 −0
Original line number Diff line number Diff line
@@ -56,6 +56,48 @@
        "GKFS_GENERATE_COVERAGE_REPORTS": true
      }
    },
    {
      "name": "asan",
      "hidden": true,
      "inherits": "debug",
      "cacheVariables": {
        "GKFS_BUILD_TESTS": true,
        "GKFS_BUILD_FUSE": false,
        "GKFS_BUILD_PERFORMANCE": false,
        "CMAKE_CXX_FLAGS": "-Wall -Wextra -g -O1 -fsanitize=address -fno-omit-frame-pointer",
        "CMAKE_C_FLAGS": "-Wall -Wextra -g -O1 -fsanitize=address -fno-omit-frame-pointer",
        "CMAKE_EXE_LINKER_FLAGS": "-fsanitize=address",
        "CMAKE_SHARED_LINKER_FLAGS": "-fsanitize=address"
      }
    },
    {
      "name": "ubsan",
      "hidden": true,
      "inherits": "debug",
      "cacheVariables": {
        "GKFS_BUILD_TESTS": true,
        "GKFS_BUILD_FUSE": false,
        "GKFS_BUILD_PERFORMANCE": false,
        "CMAKE_CXX_FLAGS": "-Wall -Wextra -g -O1 -fsanitize=undefined -fno-omit-frame-pointer",
        "CMAKE_C_FLAGS": "-Wall -Wextra -g -O1 -fsanitize=undefined -fno-omit-frame-pointer",
        "CMAKE_EXE_LINKER_FLAGS": "-fsanitize=undefined",
        "CMAKE_SHARED_LINKER_FLAGS": "-fsanitize=undefined"
      }
    },
    {
      "name": "tsan",
      "hidden": true,
      "inherits": "debug",
      "cacheVariables": {
        "GKFS_BUILD_TESTS": true,
        "GKFS_BUILD_FUSE": false,
        "GKFS_BUILD_PERFORMANCE": false,
        "CMAKE_CXX_FLAGS": "-Wall -Wextra -g -O1 -fsanitize=thread -fno-omit-frame-pointer",
        "CMAKE_C_FLAGS": "-Wall -Wextra -g -O1 -fsanitize=thread -fno-omit-frame-pointer",
        "CMAKE_EXE_LINKER_FLAGS": "-fsanitize=thread",
        "CMAKE_SHARED_LINKER_FLAGS": "-fsanitize=thread"
      }
    },
    {
      "name": "docs",
      "inherits": "debug",
@@ -96,6 +138,36 @@
        "coverage"
      ]
    },
    {
      "name": "default-asan",
      "displayName": "Default gekkofs (AddressSanitizer)",
      "inherits": ["default", "asan"],
      "cacheVariables": {
        "GKFS_BUILD_TESTS": true,
        "GKFS_BUILD_FUSE": false,
        "GKFS_BUILD_PERFORMANCE": false
      }
    },
    {
      "name": "default-ubsan",
      "displayName": "Default gekkofs (UndefinedBehaviorSanitizer)",
      "inherits": ["default", "ubsan"],
      "cacheVariables": {
        "GKFS_BUILD_TESTS": true,
        "GKFS_BUILD_FUSE": false,
        "GKFS_BUILD_PERFORMANCE": false
      }
    },
    {
      "name": "default-tsan",
      "displayName": "Default gekkofs (ThreadSanitizer)",
      "inherits": ["default", "tsan"],
      "cacheVariables": {
        "GKFS_BUILD_TESTS": true,
        "GKFS_BUILD_FUSE": false,
        "GKFS_BUILD_PERFORMANCE": false
      }
    },
    {
      "name": "default-release",
      "displayName": "Default gekkofs (release)",
@@ -122,6 +194,39 @@
        "coverage"
      ]
    },
    {
      "name": "ci-asan",
      "displayName": "CI GekkoFS (AddressSanitizer)",
      "binaryDir": "${sourceDir}/gkfs/build-asan",
      "inherits": ["ci", "default", "asan"],
      "cacheVariables": {
        "GKFS_BUILD_TESTS": true,
        "GKFS_BUILD_FUSE": false,
        "GKFS_BUILD_PERFORMANCE": false
      }
    },
    {
      "name": "ci-ubsan",
      "displayName": "CI GekkoFS (UndefinedBehaviorSanitizer)",
      "binaryDir": "${sourceDir}/gkfs/build-ubsan",
      "inherits": ["ci", "default", "ubsan"],
      "cacheVariables": {
        "GKFS_BUILD_TESTS": true,
        "GKFS_BUILD_FUSE": false,
        "GKFS_BUILD_PERFORMANCE": false
      }
    },
    {
      "name": "ci-tsan",
      "displayName": "CI GekkoFS (ThreadSanitizer)",
      "binaryDir": "${sourceDir}/gkfs/build-tsan",
      "inherits": ["ci", "default", "tsan"],
      "cacheVariables": {
        "GKFS_BUILD_TESTS": true,
        "GKFS_BUILD_FUSE": false,
        "GKFS_BUILD_PERFORMANCE": false
      }
    },
    {
      "name": "ci-docs",
      "displayName": "Documentation (CI flags)",
+11 −0
Original line number Diff line number Diff line
@@ -490,6 +490,17 @@ clang-tidy/cppcheck with narrow reviewed suppressions. Add ABI checks for
exported client/user-library symbols and application-facing structs. Publish
actionable reports and triage new warnings.

**Status: Done for the supported automated scope.** Added reproducible ASan,
UBSan, and TSan CMake presets and CI unit-test jobs; a local/CI cppcheck and
clang-tidy runner with checked-in policy and report artifacts; and exported
symbol-set ABI checks with reviewed baselines for the client, user-library, and
libc-interception libraries. Reports are documented in
`docs/sphinx/devs/analysis.md`.

The ABI check intentionally covers exported symbol presence only. Type/layout
ABI compatibility still requires `abi-dumper`/`abi-compliance-checker`, which
are not available in the supported build images and remain a follow-up.

### 28. Build a compatibility corpus

Maintain small reproducible workloads for `cp`, `tar`, `find`, `dd`, MPI-IO,
Loading