native icon indicating copy to clipboard operation
native copied to clipboard

Calculated struct array sizes incorrect categorized as flexible array members

Open brianquinlan opened this issue 11 months ago • 1 comments

The following struct, from /usr/include/linux/sysinfo.h:

struct sysinfo {
        __kernel_long_t uptime;         /* Seconds since boot */
        __kernel_ulong_t loads[3];      /* 1, 5, and 15 minute load averages */
        __kernel_ulong_t totalram;      /* Total usable main memory size */
        __kernel_ulong_t freeram;       /* Available memory size */
        __kernel_ulong_t sharedram;     /* Amount of shared memory */
        __kernel_ulong_t bufferram;     /* Memory used by buffers */
        __kernel_ulong_t totalswap;     /* Total swap space size */
        __kernel_ulong_t freeswap;      /* swap space still available */
        __u16 procs;                    /* Number of current processes */
        __u16 pad;                      /* Explicit padding for m68k */
        __kernel_ulong_t totalhigh;     /* Total high memory size */
        __kernel_ulong_t freehigh;      /* Available high memory size */
        __u32 mem_unit;                 /* Memory unit size in bytes */
        char _f[20-2*sizeof(__kernel_ulong_t)-sizeof(__u32)];   /* Padding: libc5 uses this.. */
};

is elided from code generation with:

Warning: : Removed All Struct Members from sysinfo_t(sysinfo), Flexible array members not supported.

But the array is not flexible, it is calculated.

brianquinlan avatar Apr 03 '25 00:04 brianquinlan

I would expect that these sorts of array declarations should be no problem for ffigen. It's just running clang on the header, so anything that clang can understand, ffigen should be able to understand. I tried this declaration and it seems to work:

struct flex_array {
  int x;
  char a[28 - 2 * sizeof(int) - sizeof(int)];
};

And I get this Dart struct:

final class flex_array extends ffi.Struct {
  @ffi.Int()
  external int x;

  @ffi.Array.multi([16])
  external ffi.Array<ffi.Char> a;
}

@brianquinlan What version of clang are you using? Maybe it's an older version that doesn't like these sorts of declarations? Otherwise, can you share your ffigen config, and I'll try to repro on the actual header?

liamappelbe avatar May 05 '25 01:05 liamappelbe