Привет, мои дорогие любители сишки!
Если вам начало казаться, что разработчики стандарата языка C стали предсказуемыми и больше не могут удивлять вас новыми идеями, то вы ошибались. В новом стандарте C23, комитет постановил:
— zero-sized reallocations with realloc are undefined behavior;
То есть вот это валидный код:
void *ptr = malloc(0);
free(ptr);
А вот это – UB:
void *ptr = malloc(4096);
ptr = realloc(ptr, 0); <-- хаха UB
И это несмотря на то, что в манах уже давно написано следующее:
If size is equal to zero, and ptr is not NULL, then the call is equivalent to free(ptr)
Изменение вносится задним числом, наделяя кучу корректного (согласно документации glibc) кода способностью полностью изменить логику работы программы. Ведь это то, чего нам так не хватало!
В тред призываются известные эксперты по C: Stanson и alex1101, возможно они смогут нам объяснить, зачем разработчики стандарта C постоянно пытаются отстрелить себе обе ноги самыми нелепыми способами.