ошибка выделения malloc - код irvm - PullRequest
0 голосов
/ 06 июня 2018

В приведенном ниже коде я создаю несколько массивов длиной 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 Ответ

0 голосов
/ 06 июня 2018

Подпись malloc - void* malloc(size_t size), где size_t - целочисленный тип для конкретной платформы (32-разрядные на 32-разрядных платформах, 64-разрядные на 64-разрядных платформах).

Поэтому, когда вы объявляете, что он принимает double, и называете его таковым, вы вызываете неопределенное поведение.На практике произойдет следующее: вы перемещаете значение 256.0 в двойной регистр для первых аргументов и затем вызываете malloc, который будет считывать свой аргумент из целочисленного регистра для первых аргументов (который никогда не инициализировался).

Вместо этого вы должны объявить malloc для взятия i64 на 64-х платформах и i32 на 32-битных.И затем вы также должны вызывать его с целочисленным аргументом (т.е. 256 вместо 2.56e2).

Другая проблема заключается в типе возвращаемого значения: malloc возвращает указатель, а не массив (функция C никогдавозвращаемые массивы - это даже синтаксически невозможно).Поэтому оно должно быть объявлено и использовано как таковое.

...