gpt4 book ai didi

c - 为什么 va_arg 返回错误的数据?

转载 作者:行者123 更新时间:2023-11-30 17:32:16 25 4
gpt4 key购买 nike

我正在尝试将嵌入式操作系统移植到新平台,但我遇到了文件系统组件的一些问题。我输入代码最终定位了问题:与我的案例相关的函数调用是

    // int64_t vnid = 1;
// int32_t vid = 0;
...
vnode = queue_lookup (& vnode_manager . vnode_list,
vnode_id_inspector, vnid, vid);

这是queue_lookup声明:

    void * queue_lookup (queue_t * queue, queue_inspector_t inspector, ...)
{
bool result;
va_list list, list_copy;
queue_link_t * item = NULL;

va_start (list, inspector);

if (queue -> status != 0)
{
for (item = queue -> head; item != NULL; item = item -> next)
{
result = false;

va_copy (list_copy, list);
result = inspector (item, list_copy);
va_end (list_copy);

if (result) break;
}
}

va_end (list);
return item;
}

最后,这是vnode_id_inspector声明:

    bool vnode_id_inspector (void * node, va_list list)
{
vnode_t vnode = node;
int64_t vnid = va_arg (list, int64_t);
int32_t vid = va_arg (list, int32_t);

watch (bool)
{
ensure (vnode != NULL, false);
return vnode -> id == vnid && vnode -> volume -> id == vid;
}
}

现在的问题是,当我使用 vnid=1 和 vid=0 调用queue_lookup 时,我在 vnode_id_inspector 中得到 vnid=1 和 vid=1145248!

如何以尽可能少的代码更改来解决此问题?

问候,

编辑:添加一些调试信息

    (gdb) p vnode_manager . vnode_list
$44 = {lock = 1, head = 0x167770, tail = 0x167770, status = 1}
(gdb) p vnode_manager . vnode_list ->head
$45 = (queue_link_t *) 0x167770
(gdb) p *(vnode_t)vnode_manager . vnode_list ->head
$46 = {link = {next = 0x0}, id = 1, volume = 0x166370, destroy = false,
usage_counter = 1, data = 0x166430}
(gdb) p *(volume_t)((vnode_t)vnode_manager . vnode_list ->head)->volume
$47 = {link = {next = 0x0}, id = 0, root_vnid = 1, lock = 0, host_volume = 0x0,
host_vnid = -1, cmd = 0x13a768 <rootfs_cmd>, data = 0x1663d0}

最佳答案

我解决了这个问题,堆栈对齐有问题。我通过在 cpu_context_switch.s 中进行一些调整来修复它,将堆栈对齐到 8bytes 而不是 4bytes

关于c - 为什么 va_arg 返回错误的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24282881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com