Skip to content

Merge pull request #475 from ArkScript-lang/feat/sanitizers #1001

Merge pull request #475 from ArkScript-lang/feat/sanitizers

Merge pull request #475 from ArkScript-lang/feat/sanitizers #1001

Workflow file for this run

name: "Building and testing ArkScript"
on:
push:
branches: [ dev, master ]
paths-ignore:
- '.github/workflows/benchmarks.yml'
- '.github/workflows/docker.yml'
- '.github/workflows/label.yml'
- '.github/workflows/lizard.yml'
- '.github/workflows/release.yml'
- '.vscode/*.*'
- 'examples/*.ark'
- '.github/images/*.*'
- '*.md'
- 'docs/*.*'
- 'Dockerfile'
- '.dockerignore'
- 'LICENCE'
- '.gitignore'
pull_request:
env:
BUILD_TYPE: Debug
SQLITE_VERSION: 3390100 # 3.39.1
jobs:
check:
name: Formatting Check
runs-on: ubuntu-24.04
strategy:
matrix:
path:
- 'src'
- 'include'
steps:
- uses: actions/checkout@v4
- name: Run clang-format style check for C/C++/Protobuf programs.
uses: jidicula/clang-format-action@v4.11.0
with:
clang-format-version: '13'
check-path: ${{ matrix.path }}
fallback-style: 'Mozilla' # optional
repo_visualizer:
runs-on: ubuntu-24.04
needs: [ check ]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Update diagram
uses: githubocto/repo-visualizer@main
with:
excluded_paths: 'dist,node_modules,submodules'
should_push: false
output_file: 'diagram.svg'
artifact_name: 'diagram'
build:
runs-on: ${{ matrix.config.os }}
name: ${{ matrix.config.name }}
needs: [ check ]
# todo: try and redo with https://github.com/cpp-best-practices/cmake_template/blob/main/.github/workflows/ci.yml
strategy:
fail-fast: false
matrix:
config:
- {
os: ubuntu-24.04, name: "Ubuntu Clang 16",
compiler: clang, compiler_version: 16, sanitizers: "On",
artifact: "ubuntu-clang-16"
}
- {
os: ubuntu-24.04, name: "Ubuntu Clang 16 (valgrind)",
compiler: clang, compiler_version: 16, sanitizers: "Off",
artifact: "ubuntu-clang-valgrind"
}
- {
os: ubuntu-24.04, name: "Ubuntu GCC 14",
compiler: gcc, compiler_version: 14, sanitizers: "On",
artifact: "ubuntu-gcc-14"
}
- {
os: windows-latest, name: "Windows VS 2022",
compiler: msvc, compiler_version: "", sanitizers: "On",
artifact: "windows-msvc-22"
}
- {
os: macos-latest, name: "MacOS Clang 16",
artifact: "macos-clang-16",
compiler: clang, compiler_version: 16, sanitizers: "On"
}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup compilers, dependencies, project and build
uses: ./.github/workflows/setup-compilers
with:
os_name: ${{ matrix.config.os }}
compiler: ${{ matrix.config.compiler }}
compiler_version: ${{ matrix.config.compiler_version }}
sanitizers: ${{ matrix.config.sanitizers }}
with_deps: true
- name: Organize files for upload
shell: bash
run: |
mkdir -p artifact/lib/std
# Linux/MacOS
if [[ '${{ startsWith(matrix.config.os, 'ubuntu') }}' == 'true' ]] || [[ '${{ startsWith(matrix.config.os, 'macos') }}' == 'true' ]]; then
cp build/arkscript artifact || true
cp build/libArkReactor.* artifact || true
fi
# Windows
if [[ '${{ startsWith(matrix.config.os, 'windows') }}' == 'true' ]]; then
cp build/$BUILD_TYPE/arkscript.exe artifact || true
cp build/$BUILD_TYPE/ArkReactor.dll artifact || true
fi
# Generic
cp lib/*.arkm artifact/lib
cp lib/std/*.ark artifact/lib/std
rm -rf artifact/lib/std/{.git,.github,tests/__arkscript__}
- name: Organize temp artifact
shell: bash
run: |
mkdir -p temp/tests/unittests/
cp build/unittests temp/ || true
cp build/$BUILD_TYPE/unittests.exe temp/ || true
cp -r tests/unittests temp/tests/unittests
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.config.artifact }}
path: artifact
- name: Upload temp artifact
uses: actions/upload-artifact@v4
with:
name: temp-${{ matrix.config.artifact }}
path: temp
retention-days: 1
tests:
runs-on: ${{ matrix.config.os }}
name: Tests on ${{ matrix.config.name }}
needs: [ build ]
strategy:
fail-fast: false
matrix:
config:
- { os: ubuntu-24.04, name: "Ubuntu Clang 16", artifact: "ubuntu-clang-16", compiler_version: 16, }
- { os: ubuntu-24.04, name: "Ubuntu GCC 14", artifact: "ubuntu-gcc-14", compiler_version: 14, }
- { os: windows-latest, name: "Windows VS 2022", artifact: "windows-msvc-22", compiler_version: 22, }
- { os: macos-latest, name: "MacOS Clang 16", artifact: "macos-clang-16", compiler_version: 16, }
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup tests
uses: ./.github/workflows/setup-tests
with:
os_name: ${{ matrix.config.os }}
compiler_version: ${{ matrix.config.compiler_version }}
- name: C++ unit tests
shell: bash
run: |
export ASAN_OPTIONS=detect_odr_violation=0
./unittests
- name: ArkScript unit tests
shell: bash
run: |
export ASAN_OPTIONS=detect_odr_violation=0
(cd tests/arkscript ; bash ./run-tests)
- name: Modules tests
shell: bash
run: |
export ASAN_OPTIONS=detect_odr_violation=0
chmod u+x ./lib/modules/.github/run-tests
(./lib/modules/.github/run-tests src)
- name: Runtime error message generation tests
shell: bash
run: |
export ASAN_OPTIONS=detect_odr_violation=0
(cd tests/errors ; bash ./run-tests)
fuzzing:
runs-on: ubuntu-24.04
name: Fuzz testing
continue-on-error: true
container:
image: aflplusplus/aflplusplus:v4.20c
env:
BUILD_FOLDER: afl
FUZZER_SEED: 0
FUZZ_TIME_SEC: 300
FUZZER_TIMEOUT_EXEC_MS: 500
AFL_NO_STARTUP_CALIBRATION: 1
AFL_CMPLOG_ONLY_NEW: 1
AFL_MAP_SIZE: 223723
volumes:
- ${{ github.workspace }}:/src
options: --cpus 4
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Build with AFL
run: |
cd /src
cmake -B${BUILD_FOLDER} \
-DCMAKE_C_COMPILER=/AFLplusplus/afl-cc \
-DCMAKE_CXX_COMPILER=/AFLplusplus/afl-c++ \
-DCMAKE_BUILD_TYPE=Release \
-DARK_BUILD_EXE=On \
-DARK_SANITIZERS=On
cmake --build ${BUILD_FOLDER} --config Release -j 4
- name: Fuzz
run: |
afl-fuzz -i tests/fuzzing/corpus-cmin-tmin \
-o output \
-s $FUZZER_SEED \
-t $FUZZER_TIMEOUT_EXEC_MS \
-V $FUZZ_TIME_SEC \
-- ${BUILD_FOLDER}/arkscript @@ -L ./lib
- name: Summarize
id: summary
shell: bash
run: |
echo "FUZZ_SUMMARY<<EOF" >> $GITHUB_ENV
afl-whatsup -s -d output >> $GITHUB_ENV
afl-showmap -C -i output -o /dev/null -- ./${BUILD_FOLDER}/arkscript @@ -L ./lib | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2};?)?)?[mGK]//g" | grep -v Reading | grep -v Scanning >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: Find Comment
uses: peter-evans/find-comment@v3
id: fc
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: Fuzzing report
- name: Create or update comment
uses: peter-evans/create-or-update-comment@v4
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body: |
## Fuzzing report
${{ env.FUZZ_SUMMARY }}
edit-mode: replace
- name: Sort files for upload
continue-on-error: true
run: |
mkdir crashes
cp output/default/crashes/id:* crashes/
tar -czvf crashes.tar.gz crashes
- name: Upload crashes
continue-on-error: true
uses: actions/upload-artifact@v4
with:
name: crashes
path: crashes.tar.gz
valgrind:
runs-on: ubuntu-24.04
name: Ubuntu Clang Valgrind
needs: [ build ]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Download artifact
id: download
uses: actions/download-artifact@v4
with:
name: "ubuntu-clang-valgrind"
path: build
- name: Update LLVM compilers
shell: bash
run: |
mv build/lib/*.arkm lib/
chmod u+x build/arkscript
sudo apt-get update --fix-missing
sudo apt-get install -y clang-16 lld-16 libc++-16-dev libc++abi-16-dev clang-tools-16
- name: Install valgrind 3.20.0
shell: bash
run: |
wget --no-check-certificate http://ftp.us.debian.org/debian/pool/main/v/valgrind/valgrind_3.20.0-2.1_amd64.deb
sudo apt remove needrestart
sudo apt install ./valgrind_3.20.0-2.1_amd64.deb
- name: Valgrind checks for memory leaks
shell: bash
run: |
valgrind --leak-check=full --show-leak-kinds=all \
--track-origins=yes --track-fds=yes \
--trace-children=yes \
--verbose -s \
--error-exitcode=1 \
build/arkscript tests/arkscript/unittests.ark -L ./lib valgrind