can't reliably stat() some files using relative paths

Number:rdar://FB8957317 Date Originated:2020 Dec 30
Status: Resolved:
Product:macos Product Version:11.0.1
Classification:bug Reproducible:yes
The following program tries to stat() /usr/bin/env using a relative path from the user's home directory. (This means it crosses an APFS container boundary, which might be relevant). Every now and then (in this example, once after a little over 8 million tries), the stat fails with ENOENT. This is a problem for build systems that stat files to see if they exist and/or out of date. This is a regression in catalina. We've seen this on our build bots.

% pwd

% cat a.c
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

int main() {
  for (int count = 0; ; ++count) {
    struct stat st;
    if (stat("../../usr/bin/env", &st) < 0) {
      if (errno == ENOENT)
        fprintf(stderr, "got ENOENT, count=%d\n", count);
      return 1;
% clang a.c -O2
% time ./a.out
got ENOENT, count=8335512
./a.out  0.50s user 10.92s system 78% cpu 14.536 total


Please note: Reports posted here will not necessarily be seen by Apple. All problems should be submitted at before they are posted here. Please only post information for Radars that you have filed yourself, and please do not include Apple confidential information in your posts. Thank you!