I wrote statx (Linux system call) wrapper and program to check.

```
import std.string, std.stdio;
import core.sys.posix.fcntl;

extern(C)
struct timestamp_t {
    long tv_sec;
    uint tv_nsec;
}

extern(C)
struct statx_t {
   uint stx_mask;
   uint stx_blksize;
   ulong stx_attributes;
   uint stx_nlink;
   uint stx_uid;
   uint stx_gid;
   ushort stx_mode;
   ulong stx_ino;
   ulong stx_size;
   ulong stx_blocks;
   ulong stx_attributes_mask;
   timestamp_t stx_atime;
   timestamp_t stx_btime;
   timestamp_t stx_ctime;
   timestamp_t stx_mtime;
   uint stx_rdev_major;
   uint stx_rdev_minor;
   uint stx_dev_major;
   uint stx_dev_minor;
}

extern(C)
int statx(int dfd,
          const char* filename,
          int flags,
          uint mask,
          statx_t* statxbuf);

enum STATX_BASIC_STATS = 0x000007ffU;
enum STATX_BTIME       = 0x00000800U;

enum STATX_DEFAULT = STATX_BASIC_STATS | STATX_BTIME;


statx_t specialStatX(string filepath) {
    int atflag = AT_SYMLINK_NOFOLLOW;
    statx_t stx;
    const char* p = toStringz(filepath);
    auto ret = statx(AT_FDCWD, p, atflag, STATX_DEFAULT, &stx);
    return stx;
}


void main() {
    statx_t stx = specialStatX("/usr/bin/");
    writeln(stx);
}
```

I see the output of the contents of the structure and segmentation fault.

```
$ ./statx_exp
statx_t(8191, 4096, 0, 2, 0, 0, 16877, 5242882, 135168, 272, 3160180, timestamp_t(1626714759, 723086062), timestamp_t(1615500156, 433375874), timestamp_t(1626596984, 824714693), timestamp_t(1626596984, 824714693), 0, 0, 8, 1)
Segmentation fault
```

Probably calling this function causes some mysterious stack destruction.
GDB shows:
```
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
```

My wrapper:
```
extern(C)
int statx(int dfd, const char* filename, int flags, uint mask, statx_t* statxbuf);
```
Origin (`man statx`):
```
int statx(int dirfd, const char *pathname, int flags,
          unsigned int mask, struct statx *statxbuf);
```

Structures, it seems, are also described correctly.
The problem manifests itself with all three compilers.

Reply via email to