代码之家  ›  专栏  ›  技术社区  ›  zoecarver

malloc分配错误-llvm ir代码

  •  0
  • zoecarver  · 技术社区  · 6 年前

    在下面的代码中,我创建了几个4个元素长的数组。但是,当我把它们变大(5或6个)元素时,我会得到下面的错误。

    红外码

    declare [4 x double] @malloc(double)
    
    declare double @printd(double)
    
    define double @__anon_expr0() {
    entry:
      %foo = alloca [4 x double]
      %calltmp = call [4 x double] @malloc(double 2.560000e+02)
      %0 = insertvalue [4 x double] %calltmp, double 1.000000e+00, 0
      %1 = insertvalue [4 x double] %0, double 1.000000e+00, 1
      %2 = insertvalue [4 x double] %1, double 1.000000e+00, 2
      store [4 x double] %2, [4 x double]* %foo
      %3 = getelementptr [4 x double], [4 x double]* %foo, i32 0, i32 0
      %__ = load double, double* %3
      %calltmp1 = call double @printd(double %__)
      %4 = getelementptr [4 x double], [4 x double]* %foo, i32 0, i32 0
      %__2 = load double, double* %4
      %calltmp3 = call double @printd(double %__2)
      ret double %calltmp3
    }
    
    define i32 @main() {
      call double @__anon_expr0 ()
      ret i32 0
    }
    

    错误

    built(16968,0x7fff8f39c380) malloc: *** mach_vm_map(size=140732867354624) failed (error code=3)
    *** error: can't allocate region
    *** set a breakpoint in malloc_error_break to debug
    

    是什么导致了错误?我认为malloc可以处理多于4个元素的数组。我做错了什么?

    1 回复  |  直到 6 年前
        1
  •  2
  •   sepp2k    6 年前

    签名 malloc void* malloc(size_t size) 哪里 size_t 是特定于平台的整数类型(32位平台上为32位,64位平台上为64位)。

    所以,当你声明它接受一个double并这样调用它时,你调用的是未定义的行为。实际上,将要发生的是,将256.0的值移动到第一个参数的双寄存器中,然后调用 马洛克 ,它将从整数寄存器中读取第一个参数(从未初始化)的参数。

    相反,你应该申报 马洛克 接受 i64 在64个平台和 i32 在32位上。然后你也应该用一个整数参数来调用它(即。 256 而不是 2.56e2 ).

    另一个问题是返回类型: 马洛克 返回一个指针,而不是数组(C函数从不返回数组——这在语法上是不可能的)。因此,它应该被宣布并作为这样使用。