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