Из одной библиотеки (на которую я уже жаловался)
Если кто забыл -- void free(void*). То есть, имеем UB по стандарту С. Да, оно работает, пока cdecl и компилятор не намудрит с оптимизацией.
Интересный факт: так как это UB, компилятор имеет право делать все, что угодно. Prerelease GCC 4.3, если типы функций были несовместимы, возвращал NULL. К релизу пришлось поменять назад, ибо дофига софта "поломалось".
typedef void (* clist_func)(void *, void *); void clist_foreach(clist * lst, clist_func func, void * data) { clistiter * cur; for(cur = clist_begin(lst) ; cur != NULL ; cur = cur->next) func(cur->data, data); } //.... clist_foreach(list, (clist_func)free, NULL);
Если кто забыл -- void free(void*). То есть, имеем UB по стандарту С. Да, оно работает, пока cdecl и компилятор не намудрит с оптимизацией.
Интересный факт: так как это UB, компилятор имеет право делать все, что угодно. Prerelease GCC 4.3, если типы функций были несовместимы, возвращал NULL. К релизу пришлось поменять назад, ибо дофига софта "поломалось".
Комментариев нет:
Отправить комментарий