【问题标题】:compiler segfault when printf is added (gcc 10.2 aarch64_none-elf- from arm)添加 printf 时的编译器段错误(来自 arm 的 gcc 10.2 aarch64_none-elf-)
【发布时间】:2022-01-24 07:46:33
【问题描述】:

我知道这不足以解决堆栈溢出问题,但是 ..
这是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 中取消引用 lenp。你确定它指向一个有效的位置,而不是,例如,NULL
  • Chan Kim,试试printf("prop:%p lenp:%p poffset:%d\n", prop, lenp, poffset); 并报告结果。
  • 如果编译器本身出现段错误(如您所说),那么这是编译器中的错误。
  • @ChanKim 你能显示编译的逐字错误日志吗?
  • 因为它是 u-boot,你可能会踢出超过限制的二进制大小,这可能会使事情发生段错误(我认为链接器脚本可能会检查)。即,您拥有的板子的内部 RAM 有限,用于放置 u-boot。您使代码命中 bss/stack 空间并崩溃。每个人都需要更多的通话背景。您可以提供系统参考(STMxx-dev-board 等)和您使用的 git 代码的链接。 fdt 可能会损坏等。

标签: gcc segmentation-fault arm u-boot device-tree


【解决方案1】:

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

您问题中的代码不完整(缺少fdt_get_property_namelen_printfNULL 等的声明)。用完整的自包含源文件复现问题并提交bug报告:https://gcc.gnu.org/bugzilla/

【讨论】:

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

    【讨论】:

    • 是的,我刚刚注意到并删除了第三个项目符号。
    • 您好,如果 lenp 为 NULL 或未指向有效内存,则应在运行时将其终止。这是一个编译时段错误。
    • @ChanKim: 编译时间段错误???见鬼,我从来没有听说过。如果你的编译器在编译过程中崩溃了,那么 bug 是编译器,而不是你的代码。
    • 这些问题都不应该导致编译器本身出现段错误。
    猜你喜欢
    • 2019-01-27
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多