forked from LuaJIT/LuaJIT
-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This patch adds CI testing with Valgrind in three scenarios: - Full leak checks enabled. - No leak checks, with memory fill set to `--malloc-fill=0x00` and `--free-fill=0x00`. - No leak checks, with memory fill set to `--malloc-fill=0xff` and `--free-fill=0xff`. The use of `0x00` and `0xff` for memory fill helps to detect dirty reads. `0x00` mimics zero-initialized memory, which can mask some uninitialized memory usage. `0xff` fills memory with non-zero values to make such errors easier to spot. Closes tarantool/tarantool#3705 Reviewed-by: Sergey Bronnikov <[email protected]> Reviewed-by: Sergey Kaplun <[email protected]> Signed-off-by: Sergey Kaplun <[email protected]> (cherry picked from commit 508171c)
- Loading branch information
Showing
3 changed files
with
126 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
# Setup environment for Valgrind on Linux | ||
|
||
Action setups the environment on Linux runners (install requirements, setup the | ||
workflow environment, etc) for testing with Valgrind. | ||
|
||
## How to use Github Action from Github workflow | ||
|
||
Add the following code to the running steps before LuaJIT configuration: | ||
``` | ||
- uses: ./.github/actions/setup-valgrind | ||
if: ${{ matrix.OS == 'Linux' }} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
name: Setup CI environment with Valgrind on Linux | ||
description: Extend setup-linux with Valgrind installation | ||
|
||
runs: | ||
using: composite | ||
steps: | ||
- name: Setup CI environment (Linux) | ||
uses: ./.github/actions/setup-linux | ||
- name: Install Valgrind | ||
run: | | ||
apt -y install valgrind | ||
shell: bash |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
name: Valgrind testing | ||
|
||
on: | ||
push: | ||
branches-ignore: | ||
- '**-notest' | ||
- 'upstream-**' | ||
tags-ignore: | ||
- '**' | ||
|
||
concurrency: | ||
# An update of a developer branch cancels the previously | ||
# scheduled workflow run for this branch. However, the default | ||
# branch, and long-term branch (tarantool/release/2.11, | ||
# tarantool/release/2.10, etc) workflow runs are never canceled. | ||
# | ||
# We use a trick here: define the concurrency group as 'workflow | ||
# run ID' + # 'workflow run attempt' because it is a unique | ||
# combination for any run. So it effectively discards grouping. | ||
# | ||
# XXX: we cannot use `github.sha` as a unique identifier because | ||
# pushing a tag may cancel a run that works on a branch push | ||
# event. | ||
group: ${{ startsWith(github.ref, 'refs/heads/tarantool/') | ||
&& format('{0}-{1}', github.run_id, github.run_attempt) | ||
|| format('{0}-{1}', github.workflow, github.ref) }} | ||
cancel-in-progress: true | ||
|
||
jobs: | ||
test-valgrind: | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
# XXX: Let's start with only Linux/x86_64. | ||
# We don't test on arm64 because the address returned by | ||
# the system allocator may exceed 47 bits. As a result, we | ||
# are unable to allocate memory for `lua_State`. | ||
# Therefore, testing on this platform is currently | ||
# disabled. | ||
BUILDTYPE: [Debug, Release] | ||
VALGRIND_SCENARIO: [full, malloc-free-fill-0x00, malloc-free-fill-0xff] | ||
include: | ||
- BUILDTYPE: Debug | ||
CMAKEFLAGS: -DCMAKE_BUILD_TYPE=Debug -DLUA_USE_ASSERT=ON -DLUA_USE_APICHECK=ON | ||
- BUILDTYPE: Release | ||
CMAKEFLAGS: -DCMAKE_BUILD_TYPE=RelWithDebInfo | ||
- VALGRIND_SCENARIO: full | ||
VALGRIND_OPTS: --leak-check=full --show-leak-kinds=all --track-origins=yes | ||
JOB_POSTFIX: "leak-check: full" | ||
# The use of `0x00` and `0xFF` for memory fill helps | ||
# to detect dirty reads. `0x00` mimics | ||
# zero-initialized memory, which can mask some | ||
# uninitialized memory usage. `0xFF` fills memory with | ||
# a non-zero values to make such errors easier to | ||
# spot. | ||
- VALGRIND_SCENARIO: malloc-free-fill-0x00 | ||
VALGRIND_OPTS: --leak-check=no --malloc-fill=0x00 --free-fill=0x00 | ||
JOB_POSTFIX: "malloc/free-fill: 0x00" | ||
- VALGRIND_SCENARIO: malloc-free-fill-0xff | ||
VALGRIND_OPTS: --leak-check=no --malloc-fill=0xff --free-fill=0xff | ||
JOB_POSTFIX: "malloc/free-fill: 0xff" | ||
runs-on: [self-hosted, regular, Linux, x86_64] | ||
name: > | ||
LuaJIT with Valgrind (Linux/x86_64) | ||
${{ matrix.BUILDTYPE }} | ||
CC: gcc | ||
GC64:ON SYSMALLOC:ON | ||
${{ matrix.JOB_POSTFIX }} | ||
steps: | ||
- uses: actions/checkout@v4 | ||
with: | ||
fetch-depth: 0 | ||
submodules: recursive | ||
- name: setup Linux for Valgrind | ||
uses: ./.github/actions/setup-valgrind | ||
- name: configure | ||
# XXX: LuaJIT configuration requires a couple of tweaks: | ||
# LUAJIT_USE_SYSMALLOC=ON: Unfortunately, the internal | ||
# LuaJIT memory allocator is not instrumented yet, so to | ||
# find any memory errors, it's better to build LuaJIT with | ||
# the system-provided memory allocator (i.e. run CMake | ||
# configuration phase with -DLUAJIT_USE_SYSMALLOC=ON). | ||
# For more info, see root CMakeLists.txt. | ||
# LUAJIT_ENABLE_GC64=ON: LUAJIT_USE_SYSMALLOC cannot be | ||
# enabled on x64 without GC64, since realloc usually | ||
# doesn't return addresses in the right address range. | ||
# For more info, see root CMakeLists.txt. | ||
run: > | ||
cmake -S . -B ${{ env.BUILDDIR }} | ||
-G Ninja | ||
${{ matrix.CMAKEFLAGS }} | ||
-DLUAJIT_USE_VALGRIND=ON | ||
-DLUAJIT_ENABLE_GC64=ON | ||
-DLUAJIT_USE_SYSMALLOC=ON | ||
- name: build | ||
run: cmake --build . --parallel | ||
working-directory: ${{ env.BUILDDIR }} | ||
- name: test | ||
env: | ||
VALGRIND_OPTS: ${{ matrix.VALGRIND_OPTS }} | ||
run: cmake --build . --parallel --target LuaJIT-test | ||
working-directory: ${{ env.BUILDDIR }} |