C 语言中 printf 出现段错误,无警告

Tum*_*yrd 4 c

这是一个简短的程序,运行时会出现段错误。即使在迂腐的层面上,它也不会发出关于 clang 的警告。

#include <stdio.h>
#include <stdlib.h>

typedef struct object {
    int type;
} object;

void write(object *obj) {
    switch (obj->type) {
    case 1:
        break;
    }
}

int main(void) {
    printf("hi");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 x86 Linux 上似乎不会发生崩溃,但我在 aarch64 Android 上。

$ gcc --version
clang version 17.0.6
Target: aarch64-unknown-linux-android24
Thread model: posix
InstalledDir: /data/data/com.termux/files/usr/bin

$ uname -a
Linux localhost 5.10.177-android13-4-00003-ga7208022a7ea-ab10815828 #1 SMP PREEMPT Fri Sep 15 16:40:54 UTC 2023 aarch64 Android
Run Code Online (Sandbox Code Playgroud)

使用 gdb 跟踪它看起来printf最终会调用write,但我现在不知道会发生这种情况。

这看起来像是一个编译器错误,但我可以很好地编译和运行其他程序。如果我删除printffrommain或 的定义,write那么这将按预期运行。有人可以解释一下发生了什么事吗?

dbu*_*ush 5

write是库函数的名称。使用此名称创建函数可以覆盖库函数并导致调用它。printf最有可能使用的实施write

与保留库函数同名的定义函数或变量可能会触发代码中未定义的行为,因此请将名称更改为其他名称。

  • 这是 C 实现中的一个缺陷。`write` 不是 C 标准中的保留名称。程序应该能够使用它。 (3认同)
  • @WeatherVane问题不在于编译器,而在于stdio。它需要调用像`__internal_write`这样的sonmething而不是`write`,这样它就不会被用户定义的写入破坏。我怀疑它是由您可以在编译行中提供的宏控制的。 (3认同)
  • dbush,“与保留库函数同名的定义函数或变量可能会触发代码中的未定义行为”是正确的,但不支持断言 `write()` 是_reserved_。请提供一个引用。 (2认同)