LINUX.ORG.RU

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

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

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
 
int main() {
  int *p = (int*)malloc(sizeof(int));
  intptr_t c1 = (intptr_t)p; 
  int *k = (int*)realloc(p, sizeof(int));
  intptr_t c2 = (intptr_t)k;
  *k = 2;
  if (c1 == c2) {
    *(int *)c1 = 1;
    printf("%d %d\n", *(int *)c1, *(int *)c2);
  }
}

Выводит 1 2 на clang. Хотя тут формально даже UB нет: к p я после realloc не обращаюсь, по адресу из c1 пишу после того, как убедился, что он указывает на k (равен c2).

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

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
 
int main() {
  int *p = (int*)malloc(sizeof(int));
  intptr_t c1 = (intptr_t)p; 
  int *k = (int*)realloc(p, sizeof(int));
  intptr_t c2 = (intptr_t)k;
  *k = 2;
  if (c1 == c2) {
    *(int *)c1 = 1;
    printf("%d %d\n", *(int *)c1, *(int *)c2);
  }
}

Выводит 1 2 на clang. Хотя тут формально даже UB нет: к p я после realloc не обращаюсь, по адресу из c1 пишу после того, как убедился, что он указывает на k.