LINUX.ORG.RU

История изменений

Исправление a--, (текущая версия) :

Во-первых, с чего это ты взял что компилятор может делать какие-то предположения о семантике маллока?

Он не только может, но и делает, причем знает про все функции стандартной библиотеки. LD_PRELOAD это проблемы индейцев. Пункт стандарта не скажу. В коде внизу остается только один malloc и один free при -O2.

#include <stdlib.h>

void f(int* ip);

int main(int argc, char** argv)
{
  int* p1 = malloc(sizeof(int)); *p1 = argc;
  int* p2 = malloc(sizeof(int)); *p2 = argc;
  int* p3 = malloc(sizeof(int)); *p3 = argc;

  f(p2);

  int result = *p1+*p2+*p3;

  free(p3);
  free(p2);
  free(p1);

  return result;
}

main:
        push    {r3, r4, r5, lr}
        mov     r5, r0
        movs    r0, #4
        bl      malloc
        mov     r4, r0
        str     r5, [r0]
        bl      f
        mov     r0, r4
        ldr     r3, [r4]
        add     r5, r3, r5, lsl #1
        bl      free
        mov     r0, r5
        pop     {r3, r4, r5, pc}

Исходная версия a--, :

Во-первых, с чего это ты взял что компилятор может делать какие-то предположения о семантике маллока?

Он не только может, но и делает, причем знает про все функции стандартной библиотеки. LD_PRELOAD это проблемы индейцев. Пункт стандарта не скажу. В коде внизу остается только один malloc и один free при -O2.

#include <stdlib.h>

void f(int* ip);

int main(int argc, char** argv)
{
  int* p1 = malloc(sizeof(int)); *p1 = argc;
  int* p2 = malloc(sizeof(int)); *p2 = argc;
  int* p3 = malloc(sizeof(int)); *p3 = argc;

  f(p2);

  int result = *p1+*p2+*p3;

  free(p3);
  free(p2);
  free(p1);

  return result;
}