История изменений
Исправление 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;
}