gpt4 book ai didi

编译器过度优化导致数据运行时和调试不一致

转载 作者:行者123 更新时间:2023-12-02 04:46:51 24 4
gpt4 key购买 nike

我有以下代码:

struct cre_eqEntry *      
cre_eventGet(struct cre_eqObj *eq_obj)
{
struct cre_eqEntry *eqe = cre_queueTailNode(&eq_obj->q);
Memcpy(&tmpEqo, eq_obj, sizeof(struct cre_eqObj));
volatile u32 ddd = 0;
ddd = ((struct cre_eqEntry *)(eq_obj->q.dma_mem.virtaddr + 4 * eq_obj->q.tail))->evt;
CPUMemFenceReadWrite();

if (!ddd) {
tmp = eq_obj->q.tail;
assert(0);
return NULL;
}
}

这是一段内核代码。当我运行它时,它在 assert(0) 处失败。所以显然 ddd 应该是 0。但是当我使用 GDB 调试核心转储并打印出 '((struct cre_eqEntry *)(eq_obj->q.dma_mem.virtaddr + 4 * eq_obj->q.tail))->evt ',令人惊讶的是,该值不是 0。

所以我开始怀疑是编译器过度优化的问题。这是反汇编代码:

00000000000047ec <cre_eventGet>:
47ec: 55 push %rbp
47ed: 48 89 fe mov %rdi,%rsi
47f0: ba 80 00 00 00 mov $0x80,%edx
47f5: 53 push %rbx
47f6: 48 89 fb mov %rdi,%rbx
47f9: 48 83 ec 18 sub $0x18,%rsp
47fd: 0f b7 6f 24 movzwl 0x24(%rdi),%ebp
4801: 0f b7 47 28 movzwl 0x28(%rdi),%eax
4805: 0f af e8 imul %eax,%ebp
4808: 48 63 ed movslq %ebp,%rbp
480b: 48 03 6f 18 add 0x18(%rdi),%rbp
480f: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 4816 <cre_eventGet+0x2a>
4816: e8 00 00 00 00 callq 481b <cre_eventGet+0x2f>
481b: 0f b7 43 28 movzwl 0x28(%rbx),%eax
481f: 48 8b 53 18 mov 0x18(%rbx),%rdx
4823: c7 44 24 0c 00 00 00 movl $0x0,0xc(%rsp)
482a: 00
482b: c1 e0 02 shl $0x2,%eax
482e: 48 98 cltq
4830: 8b 04 02 mov (%rdx,%rax,1),%eax
4833: 89 44 24 0c mov %eax,0xc(%rsp)
4837: 0f ae f0 mfence
483a: 8b 44 24 0c mov 0xc(%rsp),%eax
483e: 85 c0 test %eax,%eax
4840: 74 14 je 4856 <cre_eventGet+0x6a>

据我所知,汇编代码与 C 代码做同样的事情。

所以现在我想不出是什么导致了“ddd”的不一致问题。

请给我一些提示!

最佳答案

ddd = ((struct cre_eqEntry *)(eq_obj->q.dma_mem.virtaddr + 4 * eq_obj->q.tail))->evt;

简化您的代码。执行地址/边界检查/验证。您的问题很可能是您在进程/线程的地址空间中取消引用一些随机的、未初始化的地址。

关于编译器过度优化导致数据运行时和调试不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32164544/

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