Я пока не могу – мне тут valgrind какую-то дичь верещит.
Есть такой вот код:
struct entry_s {
void (*handler) (void);
struct entry_s *next;
};
typedef entry_s entry_t;
typedef struct {
entry_t *first;
entry_t *last;
} entries_t;
// сюда они добавляются в начале рантайма
static entries_t entries = { NULL, NULL };
// где-то ниже по коду дела
entry_t *entry = entries.first;
while (entry) {
entry->handler();
entry = entry->next; // valgrind: Invalid read of size 8
}
Вот скажи мне, как неойтишник, какого хуя ему не нравится?

так какие у тебя проблемы с этим “минималом”?
я его скомпилил со всякими санитайзерам и ворнингами, работает вроде всё
$ gcc -Wall -Wextra -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=leak -fsanitize=undefined deep-purple.c $ ./a.out handle entry: 0x603000000010 -> 0 handle entry: 0x603000000040 -> 1 handle entry: 0x6030000000a0 -> 3 handle entry: 0x6030000000d0 -> 4 handle entry: 0x603000000100 -> 5 handle entry: 0x603000000130 -> 6 handle entry: 0x603000000160 -> 7🗿