在指针中存储双精度时访问错误——llvm IR

bad access when storing double in pointer -- llvm IR

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

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   [=11=]x48, %rsp
    0x100000ef7 <+119>: retq
Target 0: (built) stopped.
stop reason = EXC_BAD_ACCESS (code=1, address=0x0) 

EXC_BAD_ACCESS 意味着你在非法访问内存,address=0x0 意味着你试图访问的地址是 0。所以,如果这发生在 store double 1.000000e+00, double* %9%9 必须是空指针。这意味着您的内部数组中的 double* 为空。

PS:

%9 = getelementptr double, double* %load_elem_ptr, i32 0

这与您的问题无关,但您在这里将 %9 设置为等于 %load_elem_ptr + 0,这是一个空操作。