[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Lua define ARRAY_FLEXIBLE_MEMBER
- From: Steffen Nurpmeso <steffen@...>
- Date: Mon, 14 Nov 2022 22:29:44 +0100
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)