我知道这不足以解决堆栈溢出问题,但
这是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 = %dn", nodeoffset, name, namelen);
prop = fdt_get_property_namelen_(fdt, nodeoffset, name, namelen, lenp,
&poffset);
//printf("uuu1 prop = 0x%lx, *lenp = 0x%x, poffset = 0x%xn", 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的注释,编译器seg就会出错
我不知道。这纯粹是编译器的问题吗(我认为它应该永远不会死(?或者它可以在另一个代码中的某个地方与我的错误联系起来吗?有什么方法可以知道segfault的原因吗?(可能不是。(
如果在运行编译器本身时遇到分段错误,则编译器存在错误。代码中有一些错误,但这些错误应该会导致编译时诊断(警告或错误消息(,而不是编译时崩溃。
问题中的代码不完整(缺少fdt_get_property_namelen_
、printf
、NULL
等的声明(。使用完整的自包含源文件再现问题,并提交错误报告:https://gcc.gnu.org/bugzilla/
printf("uuu1 prop = 0x%lx, *lenp = 0x%x, poffset = 0x%xn", prop, *lenp, poffset);
prop
是一个指针,所以我会使用%p
而不是%lx
lenp
是一个指针,所以我要确保它指向有效的内存