From 1c27e4d2c7cc98f70e8ca9a607a0158094e1df8b Mon Sep 17 00:00:00 2001 From: light7734 Date: Sun, 20 Jul 2025 08:22:27 +0330 Subject: [PATCH] ci: add memory sanitization check --- tools/ci/images/memory_sanitizer/Dockerfile | 67 +++++++++++++++++++++ tools/ci/steps/amd64/clang/msan.sh | 25 ++++++++ tools/scripts/build_ci_images.sh | 5 +- 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 tools/ci/images/memory_sanitizer/Dockerfile create mode 100755 tools/ci/steps/amd64/clang/msan.sh diff --git a/tools/ci/images/memory_sanitizer/Dockerfile b/tools/ci/images/memory_sanitizer/Dockerfile new file mode 100644 index 0000000..0ed3caf --- /dev/null +++ b/tools/ci/images/memory_sanitizer/Dockerfile @@ -0,0 +1,67 @@ +FROM archlinux:base-devel + +RUN pacman -Syu --noconfirm && \ + pacman -S --noconfirm \ + bash \ + base-devel \ + clang \ + llvm \ + cmake \ + git \ + python \ + python-pip \ + mesa \ + mold \ + ninja \ + zlib \ + libunwind + +RUN pip install --no-cache-dir --break-system-packages conan gitpython \ + && conan profile detect + +RUN clang --version \ + && conan --version \ + && pip --version \ + && cmake --version \ + && g++ --version \ + && clang --version \ + && ninja --version \ + && mold --version + +RUN git clone --depth=1 https://github.com/llvm/llvm-project.git -b llvmorg-20.1.8 \ + && cd llvm-project/ \ + && mkdir build/ \ + && cd build/ \ + && cmake \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_LINKER_TYPE="MOLD" \ + -DCMAKE_INSTALL_PREFIX=/libcxx_msan \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ + -DLLVM_ENABLE_PIC=ON \ + -DLIBCXX_INSTALL_MODULES=ON \ + -DLIBCXXABI_USE_LLVM_UNWINDER=OFF \ + -DLLVM_USE_SANITIZER=MemoryWithOrigins \ + ../runtimes \ + && ninja cxx cxxabi \ + && ninja -C . install-cxx install-cxxabi \ + && rm -r /llvm-project/ + +RUN git clone 'https://git.light7734.com/light7734/light.git' \ + && cd light \ + && conan install . \ + -c tools.system.package_manager:mode=install \ + -c tools.cmake.cmaketoolchain:generator=Ninja \ + -c tools.build:cxxflags='["-g", "-fno-omit-frame-pointer", "-nostdinc++", "-isystem", "/libcxx_msan/include/c++/v1/", "-fsanitize=memory", "-fsanitize-memory-track-origins"]' \ + -c tools.build:sharedlinkflags='["-L/libcxx_msan/lib", "-Wl,-rpath,/libcxx_msan/lib", "-lc++", "-lc++abi", "-fsanitize=memory", "-fsanitize-memory-track-origins"]' \ + -c tools.build:exelinkflags='["-L/libcxx_msan/lib", "-Wl,-rpath,/libcxx_msan/lib", "-lc++", "-lc++abi", "-fsanitize=memory", "-fsanitize-memory-track-origins"]' \ + -c tools.info.package_id:confs='["tools.build:cxxflags","tools.build:sharedlinkflags","tools.build:exelinkflags"]' \ + -c tools.build:compiler_executables='{"c": "clang", "cpp": "clang++"}' \ + -s build_type=Release \ + -s compiler=clang \ + -s compiler.version=20 \ + -s compiler.libcxx=libc++ \ + -o use_mold=True \ + --build=missing diff --git a/tools/ci/steps/amd64/clang/msan.sh b/tools/ci/steps/amd64/clang/msan.sh new file mode 100755 index 0000000..7d63337 --- /dev/null +++ b/tools/ci/steps/amd64/clang/msan.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +set -e +cd $(git rev-parse --show-toplevel)/ +rm -rf ./build + +conan build . \ + -c tools.system.package_manager:mode=install \ + -c tools.cmake.cmaketoolchain:generator=Ninja \ + -c tools.build:cxxflags='["-g", "-fno-omit-frame-pointer", "-nostdinc++", "-isystem", "/libcxx_msan/include/c++/v1/", "-fsanitize=memory", "-fsanitize-memory-track-origins"]' \ + -c tools.build:sharedlinkflags='["-L/libcxx_msan/lib", "-Wl,-rpath,/libcxx_msan/lib", "-lc++", "-lc++abi", "-fsanitize=memory", "-fsanitize-memory-track-origins"]' \ + -c tools.build:exelinkflags='["-L/libcxx_msan/lib", "-Wl,-rpath,/libcxx_msan/lib", "-lc++", "-lc++abi", "-fsanitize=memory", "-fsanitize-memory-track-origins"]' \ + -c tools.info.package_id:confs='["tools.build:cxxflags","tools.build:sharedlinkflags","tools.build:exelinkflags"]' \ + -c tools.build:compiler_executables='{"c": "clang", "cpp": "clang++"}' \ + -s build_type=Release \ + -s compiler=clang \ + -s compiler.version=20 \ + -s compiler.libcxx=libc++ \ + -o use_mold=True \ + --build=missing + +for test in $(find ./build -type f -name '*_tests' -executable); do + echo "Running $test" + "$test" +done diff --git a/tools/scripts/build_ci_images.sh b/tools/scripts/build_ci_images.sh index 12574a6..289d879 100755 --- a/tools/scripts/build_ci_images.sh +++ b/tools/scripts/build_ci_images.sh @@ -1,7 +1,6 @@ #!/bin/bash set -e - IMAGE_DIR="$(git rev-parse --show-toplevel)/tools/ci/images" echo "==> Building image: clang format" @@ -24,4 +23,8 @@ echo "==> Building image: leak_sanitizer" cd "$IMAGE_DIR/leak_sanitizer" docker build -t leak_sanitizer . +echo "==> Building image: memory_sanitizer" +cd "$IMAGE_DIR/memory_sanitizer" +docker build -t memory_sanitizer . + echo "WOOOOOOOOOOOOOOOOH!!! DONE :D"