Closed starwing closed 1 month ago
(btw, I found another warning when use yyjson_inline_api as yyjson_api:
yyjson.c|6296 col 37| warning: pointer 'val_hdr' may be used after 'realloc' [-Wuse-after-free]
|| 6296 | val = val_tmp + (usize)(val - val_hdr); \
|| | ^
yyjson.c|6358 col 5| note: in expansion of macro 'val_incr'
|| 6358 | val_incr();
|| | ^~~~~~~~
|| In function 'default_realloc',
)
The first warning happens because the definition of yyjson_api
is changed.
The original code is like this, and it's fine:
extern void foo(void);
static inline void bar(void) {
foo();
}
But when you #define yyjson_api static
, it changes extern
to static
, causing a warning:
static void foo(void);
static inline void bar(void) {
foo();
}
The second warning comes from including yyjson.c
directly.
In yyjson.c, alc.realloc()
is used to call realloc indirectly through a function pointer. Normally, yyjson.c is compiled separately, so there's no warning.
But if you compile yyjson.c with your code in one unit and don't use a custom allocator, GCC will perform constant propagation and inline alc.realloc() to libc's realloc(), which causes the warning.
Could you share more about why you're using the library this way?
I'm just trying to make a single DLL module on windows for Lua, in this way unused functions are stripped from the result binary, and all routes are inlined for better performance and binary size.
The first warning also makes link failure for missing symbols.
It seems that what I needed is something like yyjson_static_api.
The binding code is here: https://github.com/starwing/luabuild/blob/master/src/lyyjson.c
(Notice that all sources including Lua are amalgamated into one translation unit in one.c)
Fixed.
Describe the bug I'm writing a Lua binding for yyjson, and I find if I define YYJSON_DISABLE_UTILS like this:
the link errs like this:
Your environment