lua-users home
lua-l archive

Re: Lua define ARRAY_FLEXIBLE_MEMBER

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Roberto Ierusalimschy wrote in
 <20221114205829.GA10251@arraial.inf.puc-rio.br>:
 |> "char data[0]" is not supported by the C standard, it's a GNU extension I
 |> believe.
 |> 
 |> You can use 'offsetof' to determine the offset of a structure member, you
 |> can do something like
 |> 
 |> struct STRING
 |> {
 |> size_t length;
 |> char data[1];
 |>}
 |> 
 |> struct STRING* build_string(size_t size, const char* data)
 |> {
 |> struct STRING* p = (struct STRING*)malloc(offsetof(struct STRING, \
 |> data) +
 |> size);
 |> p->length = size;
 |> memcpy(p->data, data, size);
 |> return p;
 |
 |"char data[0]" is not standard C, and "char data[]" is not standard C89.
 |Lua uses exactly the technique described here, with offsetof, to
 |allocate Udata, CClosure, and LClosure without wasting memory.
Hm, i hate reading ISO standard so the exact wording i do not
know, but the above makes me think you do enter undefined area by
storing more in .data than is allowed (likely depending on
C compiler flags and optimization too, i have not looked what Lua
uses).
To overcome this, for my code, i use macros like VFIELD_SIZE(X)
which is empty for defined __STDC_VERSION__ && __STDC_VERSION__
+0 >= 199901l, but otherwise is a bit more complicated to come up
with an "aligned multiple" of uz (more or less size_t). I then
say "char cm_buf[VFIELD_SIZE(0)];" when alignment fits, or "char
am_name[VFIELD_SIZE(3)];" when there are other fields in the
"current alignment slot" (it is (((X) == 0 ? sizeof(uz) : (X
< 0 ? sizeof(uz) - ABS(X) : (X))))).
--steffen
|
|Der Kragenbaer, The moon bear,
|der holt sich munter he cheerfully and one by one
|einen nach dem anderen runter wa.ks himself off
|(By Robert Gernhardt)

AltStyle によって変換されたページ (->オリジナル) /