Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Calculated struct array sizes incorrect categorized as flexible array members #2161

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
brianquinlan opened this issue Apr 3, 2025 · 1 comment
Assignees

Comments

@brianquinlan
Copy link
Contributor

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.

@liamappelbe
Copy link
Contributor

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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants