存储双入指针时访问错误-llvm IR

时间:2018-06-20 18:16:55

标签: llvm llvm-ir

在下面的代码中,我尝试做的是从结构体中的嵌套结构体中加载一个double数组(表示为指针),然后将值存储在final元素中。当我尝试执行此操作时,出现分段错误(下面的调试)。为什么会出现细分错误,该如何解决?

LLVM IR代码

  %7 = getelementptr { { double*, i32 }*, i32 }, { { double*, i32 }*, i32 }* %foo3, i32 0, i32 0
  %load_array_ptr = load { double*, i32 }*, { double*, i32 }** %7
  %8 = getelementptr { double*, i32 }, { double*, i32 }* %load_array_ptr, i32 0, i32 0
  %load_elem_ptr = load double*, double** %8
  %9 = getelementptr double, double* %load_elem_ptr, i32 0
  ; problematic line:
  store double 1.000000e+00, double* %9

调试

我尝试使用lldb调试它,但是我并没有得到任何有用的信息:

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x0000000100000ee9 built`__anon_expr0 + 105
built`__anon_expr0:
->  0x100000ee9 <+105>: movsd  %xmm0, (%rax)
    0x100000eed <+109>: movsd  0x10(%rsp), %xmm0         ; xmm0 = mem[0],zero
    0x100000ef3 <+115>: addq   $0x48, %rsp
    0x100000ef7 <+119>: retq
Target 0: (built) stopped.

1 个答案:

答案 0 :(得分:0)

stop reason = EXC_BAD_ACCESS (code=1, address=0x0) 

EXC_BAD_ACCESS表示您正在非法访问内存,而address=0x0则表示您尝试访问的地址为0。因此,如果这发生在store double 1.000000e+00, double* %9上,则{{1} }必须为空指针。这意味着您内部数组中的%9为空。

PS:

double*

这与您的问题无关,但是在这里,您将%9 = getelementptr double, double* %load_elem_ptr, i32 0 设置为等于%9,这是空操作。