https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88054
--- Comment #3 from Martin Liška <marxin at gcc dot gnu.org> --- The problem looks very similar to: 3537 #if SANITIZER_INTERCEPT_REALPATH 3538 INTERCEPTOR(char *, realpath, const char *path, char *resolved_path) { 3539 void *ctx; 3540 COMMON_INTERCEPTOR_ENTER(ctx, realpath, path, resolved_path); 3541 if (path) COMMON_INTERCEPTOR_READ_RANGE(ctx, path, REAL(strlen)(path) + 1); 3542 3543 // Workaround a bug in glibc where dlsym(RTLD_NEXT, ...) returns the oldest 3544 // version of a versioned symbol. For realpath(), this gives us something 3545 // (called __old_realpath) that does not handle NULL in the second argument. 3546 // Handle it as part of the interceptor. 3547 char *allocated_path = nullptr; 3548 if (!resolved_path) 3549 allocated_path = resolved_path = (char *)WRAP(malloc)(path_max + 1); 3550 3551 char *res = REAL(realpath)(path, resolved_path); 3552 if (allocated_path && !res) WRAP(free)(allocated_path); 3553 if (res) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); 3554 return res; 3555 } 3556 #define INIT_REALPATH COMMON_INTERCEPT_FUNCTION(realpath); 3557 #else 3558 #define INIT_REALPATH 3559 #endif