Я пока не могу – мне тут 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
}

Вот скажи мне, как неойтишник, какого хуя ему не нравится?

  • ThePlayerZero
    link
    fedilink
    arrow-up
    0
    ·
    3 years ago

    так какие у тебя проблемы с этим “минималом”?

    я его скомпилил со всякими санитайзерам и ворнингами, работает вроде всё

    $ 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
    

    Чот отдельным минимальным примером не воспроизводится…

    🗿