Вызов функции через указатель на функцию, где аргументы не совпадают - PullRequest
0 голосов
/ 10 марта 2011

, пока я изучал некоторые заглушки RPC, исходные файлы C, сгенерированные RPCGEN -a msg.x в Unix. Я наткнулся на какой-то указатель на функцию, которая меня смущает.

В файле-заглушке сервера - msg_svc.c, есть объявление типа

char *(*local)();

, который объявляет указатель на функцию, которая не принимает аргументов и возвращает указатель на символ

В файле сервера - msg_server.c есть функция, определенная как

savemsg_1(argp, rqstp)
    char **argp;
    struct svc_req *rqstp;
{
     some code
}

Вернуться к файлу-заглушке сервера - msg_svc.c, я вижу коды, которые выполняют приведение указателей на функции

local = (char *(*)()) savemsg_1;

И позвонил позже

result = (*local)(&argument, rqstp);

где аргумент и rqstp определены

union {
    char *savemsg_1_arg;
    int readmsg_1_arg;
} argument;

И

struct svc_req *rqstp;

Мой вопрос: почему это работает? Я провел исследование Google / StackOverflow по указателям на функции. После приведения к указателю функции, который не принимает никаких аргументов, и вызова функции через этот указатель функции с аргументами несоответствия (в данном случае принимается 2 аргумента) должно появиться неопределенное поведение.

Источник находится по адресу msg_svc.c

Я был бы очень признателен за любые материалы. Спасибо

1 Ответ

1 голос
/ 10 марта 2011

Это неопределенное поведение.Тем не менее, одним из возможных результатов Undefined Behavior является поведение, которое вы намеревались.

В частности, сгенерированный древний код C (для savemsg_1) ясно дает понять, что он предназначен для компиляции очень старымпростые компиляторы.Они довольно предсказуемы, не используют регистры для передачи аргументов и так далее.Это увеличивает вероятность того, что код работает.Но "это вероятно работает" действительно не достижение.Не пишите такой код самостоятельно.

...