mirror of
https://github.com/syoyo/tinygltf.git
synced 2026-10-30 12:35:40 +00:00
Build v3 C under clang -Weverything and MSVC /W4
Escalate v3 C warning levels in CI to catch latent issues: gcc/clang now run with -Werror, clang adds -Weverything (with a small irreducible suppression list for -Wpadded, -Wunsafe-buffer-usage, -Wcast-align, etc.), and a new MSVC job builds tester_v3_c with /W4 /WX. Source fixes to clear the elevated warnings: - tg3__arena_new_block: cast through void* to silence -Wcast-align. - tg3__value_to_json: handle TG3_VALUE_BINARY explicitly and drop the default label so -Wswitch-enum and -Wcovered-switch-default agree. - Drop unused tg3__json_set_value_copy. - tinygltf_json_c.h: enumerate all tg3json_value_type cases in tg3json_value_free / tg3json_value_copy / tg3json__stringify_value_ex. - tester_v3_c_v1port FAIL macro: split the format/newline prints so it no longer relies on the GNU `, ##__VA_ARGS__` extension. Verified: clang -Werror -Weverything builds clean, 13/13 internal tests, 18/18 v1-port tests, and 134/134 cross-version regression all pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
a3e10174c5
commit
fc04226d57
@@ -340,13 +340,13 @@ jobs:
|
||||
- name: Build tester_v3_c
|
||||
run: |
|
||||
cd tests
|
||||
cc -I../ -std=c11 -g -O0 -Wall -Wextra -DTINYGLTF3_ENABLE_FS \
|
||||
cc -I../ -std=c11 -g -O0 -Wall -Wextra -Wpedantic -Werror -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 -Wall -Wextra -DTINYGLTF3_ENABLE_FS \
|
||||
cc -I../ -std=c11 -g -O0 -Wall -Wextra -Wpedantic -Werror -DTINYGLTF3_ENABLE_FS \
|
||||
-o tester_v3_c_v1port tester_v3_c_v1port.c ../tiny_gltf_v3.c
|
||||
|
||||
- name: Run tester_v3_c (security regressions)
|
||||
@@ -375,13 +375,21 @@ jobs:
|
||||
- name: Build tester_v3_c
|
||||
run: |
|
||||
cd tests
|
||||
clang -I../ -std=c11 -g -O0 -Wall -Wextra -DTINYGLTF3_ENABLE_FS \
|
||||
clang -I../ -std=c11 -g -O0 -Werror -Weverything \
|
||||
-Wno-padded -Wno-unsafe-buffer-usage -Wno-switch-default \
|
||||
-Wno-format-nonliteral -Wno-float-equal -Wno-cast-align \
|
||||
-Wno-declaration-after-statement -Wno-pre-c11-compat \
|
||||
-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 \
|
||||
clang -I../ -std=c11 -g -O0 -Werror -Weverything \
|
||||
-Wno-padded -Wno-unsafe-buffer-usage -Wno-switch-default \
|
||||
-Wno-format-nonliteral -Wno-float-equal -Wno-cast-align \
|
||||
-Wno-declaration-after-statement -Wno-pre-c11-compat \
|
||||
-DTINYGLTF3_ENABLE_FS \
|
||||
-o tester_v3_c_v1port tester_v3_c_v1port.c ../tiny_gltf_v3.c
|
||||
|
||||
- name: Run tester_v3_c
|
||||
@@ -411,13 +419,21 @@ jobs:
|
||||
- name: Build tester_v3_c
|
||||
run: |
|
||||
cd tests
|
||||
clang-21 -I../ -std=c11 -g -O0 -Wall -Wextra -DTINYGLTF3_ENABLE_FS \
|
||||
clang-21 -I../ -std=c11 -g -O0 -Werror -Weverything \
|
||||
-Wno-padded -Wno-unsafe-buffer-usage -Wno-switch-default \
|
||||
-Wno-format-nonliteral -Wno-float-equal -Wno-cast-align \
|
||||
-Wno-declaration-after-statement -Wno-pre-c11-compat \
|
||||
-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 \
|
||||
clang-21 -I../ -std=c11 -g -O0 -Werror -Weverything \
|
||||
-Wno-padded -Wno-unsafe-buffer-usage -Wno-switch-default \
|
||||
-Wno-format-nonliteral -Wno-float-equal -Wno-cast-align \
|
||||
-Wno-declaration-after-statement -Wno-pre-c11-compat \
|
||||
-DTINYGLTF3_ENABLE_FS \
|
||||
-o tester_v3_c_v1port tester_v3_c_v1port.c ../tiny_gltf_v3.c
|
||||
|
||||
- name: Run tester_v3_c
|
||||
@@ -430,6 +446,30 @@ jobs:
|
||||
cd tests
|
||||
./tester_v3_c_v1port
|
||||
|
||||
# v3 C runtime built with MSVC at warning-level 4 (/W4 /WX).
|
||||
v3-c-tests-msvc:
|
||||
runs-on: windows-latest
|
||||
name: v3 C tests (Windows x64, MSVC /W4)
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Build and run tester_v3_c
|
||||
shell: cmd
|
||||
run: |
|
||||
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
|
||||
cd tests
|
||||
cl /nologo /W4 /WX /std:c11 /Zi /Od /DTINYGLTF3_ENABLE_FS /I.. tester_v3_c.c ..\tiny_gltf_v3.c /Fe:tester_v3_c.exe
|
||||
tester_v3_c.exe
|
||||
|
||||
- name: Build and run tester_v3_c_v1port
|
||||
shell: cmd
|
||||
run: |
|
||||
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
|
||||
cd tests
|
||||
cl /nologo /W4 /WX /std:c11 /Zi /Od /DTINYGLTF3_ENABLE_FS /I.. tester_v3_c_v1port.c ..\tiny_gltf_v3.c /Fe:tester_v3_c_v1port.exe
|
||||
tester_v3_c_v1port.exe
|
||||
|
||||
# v3 C runtime under ASan + UBSan for memory-safety + UB checks.
|
||||
v3-c-tests-sanitizers:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -135,8 +135,10 @@ static int errstack_contains(const tg3_error_stack *e, const char *needle) {
|
||||
fprintf(stdout, " [PASS] %s\n", label); \
|
||||
return 1; \
|
||||
} while (0)
|
||||
#define FAIL(fmt, ...) do { \
|
||||
fprintf(stderr, " [FAIL] " fmt "\n", ##__VA_ARGS__); \
|
||||
#define FAIL(...) do { \
|
||||
fprintf(stderr, " [FAIL] "); \
|
||||
fprintf(stderr, __VA_ARGS__); \
|
||||
fprintf(stderr, "\n"); \
|
||||
goto fail; \
|
||||
} while (0)
|
||||
|
||||
|
||||
+7
-9
@@ -98,17 +98,17 @@ static tg3_arena *tg3__arena_create(const tg3_memory_config *config) {
|
||||
|
||||
static tg3__arena_block *tg3__arena_new_block(tg3_arena *arena, size_t min_size) {
|
||||
size_t cap = arena->block_size;
|
||||
uint8_t *raw;
|
||||
void *raw;
|
||||
tg3__arena_block *block;
|
||||
if (cap < min_size) cap = min_size;
|
||||
if (arena->max_single_alloc && cap > arena->max_single_alloc) return NULL;
|
||||
if (arena->total_allocated + sizeof(tg3__arena_block) + cap > arena->memory_budget) return NULL;
|
||||
|
||||
raw = (uint8_t *)arena->alloc.alloc(sizeof(tg3__arena_block) + cap, arena->alloc.user_data);
|
||||
raw = arena->alloc.alloc(sizeof(tg3__arena_block) + cap, arena->alloc.user_data);
|
||||
if (!raw) return NULL;
|
||||
block = (tg3__arena_block *)raw;
|
||||
block->next = NULL;
|
||||
block->base = raw + sizeof(tg3__arena_block);
|
||||
block->base = (uint8_t *)raw + sizeof(tg3__arena_block);
|
||||
block->used = 0;
|
||||
block->capacity = cap;
|
||||
arena->total_allocated += sizeof(tg3__arena_block) + cap;
|
||||
@@ -2171,10 +2171,6 @@ static int tg3__json_set_string(tg3json_value *obj, const char *key, const char
|
||||
return tg3__json_set_string_n(obj, key, str, str ? strlen(str) : 0);
|
||||
}
|
||||
|
||||
static int tg3__json_set_value_copy(tg3json_value *obj, const char *key, const tg3json_value *value) {
|
||||
return tg3json_object_set_copy(obj, key, value);
|
||||
}
|
||||
|
||||
static int tg3__json_array_append_int(tg3json_value *arr, int64_t value) {
|
||||
tg3json_value tmp;
|
||||
tg3json_value_init_int(&tmp, value);
|
||||
@@ -2370,9 +2366,11 @@ static int tg3__value_to_json(const tg3_value *v, tg3json_value *out) {
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
case TG3_VALUE_BINARY:
|
||||
/* Binary blobs cannot be represented as JSON; emit null. */
|
||||
return 1;
|
||||
}
|
||||
return 0; /* unreachable: all enum cases handled above. */
|
||||
}
|
||||
|
||||
static int tg3__serialize_extras_ext(tg3json_value *o, const tg3_extras_ext *ee) {
|
||||
|
||||
+7
-5
@@ -641,7 +641,11 @@ void tg3json_value_free(tg3json_value *value) {
|
||||
}
|
||||
free(value->u.object.items);
|
||||
break;
|
||||
default:
|
||||
case TG3JSON_NULL:
|
||||
case TG3JSON_BOOL:
|
||||
case TG3JSON_INT:
|
||||
case TG3JSON_REAL:
|
||||
/* Scalar variants own no heap memory. */
|
||||
break;
|
||||
}
|
||||
tg3json__init_value(value);
|
||||
@@ -733,9 +737,8 @@ int tg3json_value_copy(tg3json_value *dst, const tg3json_value *src) {
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 0; /* unreachable: all enum cases handled above. */
|
||||
}
|
||||
|
||||
const tg3json_value *tg3json_object_get_n(const tg3json_value *object,
|
||||
@@ -973,9 +976,8 @@ static int tg3json__stringify_value_ex(tg3json__buffer *buf, const tg3json_value
|
||||
}
|
||||
if (indent > 0 && value->u.object.count > 0 && !tg3json__indent(buf, indent, depth)) return 0;
|
||||
return tg3json__buf_putc(buf, '}');
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 0; /* unreachable: all enum cases handled above. */
|
||||
}
|
||||
|
||||
char *tg3json_stringify(const tg3json_value *value, size_t *out_len) {
|
||||
|
||||
Reference in New Issue
Block a user