Build v3 C tests under clang too; drop GNU VA_ARGS extension

ci.yml now runs the v3 C suites under three Linux toolchains:
- v3-c-tests        (default cc / GCC, -Wall -Wextra)
- v3-c-tests-clang  (stock Ubuntu clang)
- v3-c-tests-clang21 (clang 21 from apt.llvm.org, matching local dev)

The validator helper macros TG3__IDX_BAD / TG3__CHECK_REQ /
TG3__CHECK_OPT used the GNU `, ##__VA_ARGS__` extension, which clang
flags under -Wpedantic. Every call site already passes at least one
variadic argument, so plain __VA_ARGS__ (C11) suffices.

Local verification: clang-21 -Wall -Wextra builds tester_v3_c and
tester_v3_c_v1port with zero warnings introduced by the v3 changes
(only the pre-existing tg3__json_set_value_copy unused-function
notice remains, unrelated to this work). All suites pass under gcc
13.3 and clang 21.1 alike, plus the 134-model cross-version
verifier.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Syoyo Fujita
2026-05-10 04:04:15 +09:00
parent 70a6a0c0ea
commit d20c9298e5
2 changed files with 80 additions and 7 deletions

View File

@@ -332,7 +332,7 @@ jobs:
# v3 C runtime: internal security regression tests + ported v1 unit tests.
v3-c-tests:
runs-on: ubuntu-latest
name: v3 C tests (Linux x64)
name: v3 C tests (Linux x64, GCC)
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -340,13 +340,13 @@ jobs:
- name: Build tester_v3_c
run: |
cd tests
cc -I../ -std=c11 -g -O0 -DTINYGLTF3_ENABLE_FS \
cc -I../ -std=c11 -g -O0 -Wall -Wextra -DTINYGLTF3_ENABLE_FS \
-o tester_v3_c tester_v3_c.c ../tiny_gltf_v3.c
- name: Build tester_v3_c_v1port
run: |
cd tests
cc -I../ -std=c11 -g -O0 -DTINYGLTF3_ENABLE_FS \
cc -I../ -std=c11 -g -O0 -Wall -Wextra -DTINYGLTF3_ENABLE_FS \
-o tester_v3_c_v1port tester_v3_c_v1port.c ../tiny_gltf_v3.c
- name: Run tester_v3_c (security regressions)
@@ -359,6 +359,77 @@ jobs:
cd tests
./tester_v3_c_v1port
# v3 C runtime under stock Ubuntu clang.
v3-c-tests-clang:
runs-on: ubuntu-latest
name: v3 C tests (Linux x64, Clang)
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install clang
run: |
sudo apt-get update
sudo apt-get install -y clang
- name: Build tester_v3_c
run: |
cd tests
clang -I../ -std=c11 -g -O0 -Wall -Wextra -DTINYGLTF3_ENABLE_FS \
-o tester_v3_c tester_v3_c.c ../tiny_gltf_v3.c
- name: Build tester_v3_c_v1port
run: |
cd tests
clang -I../ -std=c11 -g -O0 -Wall -Wextra -DTINYGLTF3_ENABLE_FS \
-o tester_v3_c_v1port tester_v3_c_v1port.c ../tiny_gltf_v3.c
- name: Run tester_v3_c
run: |
cd tests
./tester_v3_c
- name: Run tester_v3_c_v1port
run: |
cd tests
./tester_v3_c_v1port
# v3 C runtime under bleeding-edge clang 21 (matches local dev environment).
v3-c-tests-clang21:
runs-on: ubuntu-24.04
name: v3 C tests (Linux x64, Clang 21)
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install clang 21
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 21
- name: Build tester_v3_c
run: |
cd tests
clang-21 -I../ -std=c11 -g -O0 -Wall -Wextra -DTINYGLTF3_ENABLE_FS \
-o tester_v3_c tester_v3_c.c ../tiny_gltf_v3.c
- name: Build tester_v3_c_v1port
run: |
cd tests
clang-21 -I../ -std=c11 -g -O0 -Wall -Wextra -DTINYGLTF3_ENABLE_FS \
-o tester_v3_c_v1port tester_v3_c_v1port.c ../tiny_gltf_v3.c
- name: Run tester_v3_c
run: |
cd tests
./tester_v3_c
- name: Run tester_v3_c_v1port
run: |
cd tests
./tester_v3_c_v1port
# v3 C runtime under ASan + UBSan for memory-safety + UB checks.
v3-c-tests-sanitizers:
runs-on: ubuntu-latest

View File

@@ -1617,22 +1617,24 @@ static int tg3__parse_audio_emitter(tg3__parse_ctx *ctx, const tg3json_value *o,
static int tg3__validate_indices(tg3__parse_ctx *ctx, const tg3_model *m) {
uint32_t i, j;
int errs = 0;
/* Helper macros — push with format and bump error counter. */
/* Helper macros — push with format and bump error counter. Every call
* site passes at least one variadic arg, so plain __VA_ARGS__ (C11) is
* sufficient and avoids the GNU `, ##__VA_ARGS__` extension. */
#define TG3__IDX_BAD(path_str, fmt, ...) do { \
if (errs < TG3__IDX_ERR_CAP) { \
tg3__error_pushf(ctx->errors, ctx->arena, TG3_SEVERITY_ERROR, \
TG3_ERR_INVALID_INDEX, (path_str), fmt, ##__VA_ARGS__); \
TG3_ERR_INVALID_INDEX, (path_str), fmt, __VA_ARGS__); \
} \
++errs; \
} while (0)
#define TG3__CHECK_REQ(idx, max, path_str, fmt, ...) do { \
if ((idx) < 0 || (uint32_t)(idx) >= (max)) { \
TG3__IDX_BAD(path_str, fmt, ##__VA_ARGS__); \
TG3__IDX_BAD(path_str, fmt, __VA_ARGS__); \
} \
} while (0)
#define TG3__CHECK_OPT(idx, max, path_str, fmt, ...) do { \
if ((idx) != -1 && ((idx) < 0 || (uint32_t)(idx) >= (max))) { \
TG3__IDX_BAD(path_str, fmt, ##__VA_ARGS__); \
TG3__IDX_BAD(path_str, fmt, __VA_ARGS__); \
} \
} while (0)