添加 printf 时的编译器段错误(来自 arm 的 gcc 10.2 aarch64_none-elf-)

compiler segfault when printf is added (gcc 10.2 aarch64_none-elf- from arm)

我知道这不足以解决堆栈溢出问题,但是..
这是u-boot v2021.10.scripts/dtc/libfdt/fdt_ro.c中的一个函数。

const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
                const char *name, int namelen, int *lenp)
{
    int poffset;
    const struct fdt_property *prop;

    printf("uuu0 nodeoffset = 0x%x, name = %s, namelen = %d\n", nodeoffset, name, namelen);
    prop = fdt_get_property_namelen_(fdt, nodeoffset, name, namelen, lenp,
                     &poffset);
    //printf("uuu1 prop = 0x%lx, *lenp = 0x%x, poffset = 0x%x\n", prop, *lenp, poffset);
    if (!prop)
        return NULL;

    /* Handle realignment */
    if (fdt_chk_version() && fdt_version(fdt) < 0x10 &&
        (poffset + sizeof(*prop)) % 8 && fdt32_to_cpu(prop->len) >= 8)
        return prop->data + 4;
    return prop->data;
}

当我构建程序时,如果我取消注释第二个 printf,编译器会出现段错误。
我不知道。这纯粹是编译器问题(我认为它至少应该永远不会死)?还是可以将其与我在其他代码中某处的错误联系起来?有什么方法可以知道段错误的原因吗? (可能不是。)。

printf("uuu1 prop = 0x%lx, *lenp = 0x%x, poffset = 0x%x\n", prop, *lenp, poffset);
  1. prop 是一个指针,所以我会使用 %p 而不是 %lx
  2. lenp 是一个指针,所以我要确保它指向有效内存

如果 运行 编译器本身出现分段错误,则说明编译器存在错误。您的代码中存在一些错误,但这些错误应该会导致编译时诊断(警告或错误消息),绝不会导致编译时崩溃。

您问题中的代码不完整(缺少 fdt_get_property_namelen_printfNULL 等的声明)。使用完整的独立源文件重现问题并提交错误报告:https://gcc.gnu.org/bugzilla/