> И что это говнокод 80 лвл? Демонстрирует в 2 строках, что никакой "исполнять writable memory" там и рядом не лежал?
> Зачем такое в реальном проекте.
Опять кто-то анонимный слишком поторопился с эпитетами?
man atexit
https://git.musl-libc.org/cgit/musl/tree/src/exit/atexit.c#n26
void __funcs_on_exit()
{
void (*func)(void *), *arg;
LOCK(lock);
for (; head; head=head->next, slot=COUNT) while(slot-->0) {
func = head->f[slot];
arg = head->a[slot];
UNLOCK(lock);
func(arg);
LOCK(lock);
}
}
Как впрочем и любая библиотека, предоставляющая внешние колбэки (GTKшные сигналы-слоты, куда в рантайме пачками, "извне", прилетают адреса кода, совсем не через libastral работает) и через одну -- программы с интерфейсом для подгружаемых раширений.