Привет. Я хочу присвоить указателю на функцию адрес следующей open() через dlsym и RTLD_NEXT. При сборке тестового примера с
cc -std=c17 -pedantic -Wall -Wextra -ldl test.c
ISO C forbids assignment between function pointer and ‘void *’ [-Wpedantic]
dlsym() возвращает data pointer, а присваиваем function pointer. Но, если взять пример здесь, то предупреждения компилятора при присваивании b не будет. Вопрос: пример с b это теперь не UB? Если UB, то почему пропало предупреждение? Если я не ошибаюсь, то void ** - указатель на data pointer.
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
int main(void)
{
static void (*a)(void);
static void (*b)(void);
a = dlsym(RTLD_NEXT, "open");
*(void **)(&b) = dlsym(RTLD_NEXT, "open");
if (a == b)
printf("a == b""\n");
return 0;
}