Dmitry Belyavsky (beldmit) wrote,
Dmitry Belyavsky
beldmit

Сеанс чёрной магии

Как поменять порядок аргументов, передаваемых в функцию, особо извращённым способом. И почему это работает.


#include <math.h>
#include <stdio.h>

double DoubleToTheInt(double base, int power) {
return pow(base, power);
}

int main() {
// cast to a function pointer with arguments reversed
double (*IntPowerOfDouble)(int, double) =
(double (*)(int, double))&DoubleToTheInt;

printf("(0.99)^100: %lf \n", DoubleToTheInt(0.99, 100));
printf("(0.99)^100: %lf \n", IntPowerOfDouble(100, 0.99));
}
The code above never actually defines the function IntPowerOfDouble — because there is no function IntPowerOfDouble. It's a variable that points to DoubleToTheInt, but with a type that says it likes its integer arguments to come before its doubles.

You might expect the IntPowerOfDouble to take its arguments in the same order as DoubleToTheInt, but cast the arguments to a different type, or something like that. But that's not what happens.

Try it out — you'll see the same result value printed on both lines.

emiller@gibbon ~> clang something.c
emiller@gibbon ~> ./a.out
(0.99)^100: 0.366032
(0.99)^100: 0.366032


Программиста, который такие трюки применяет, надо расстреливать увольнять.

This entry was originally posted at http://beldmit.dreamwidth.org/480228.html. Your comment? (comment count unavailable comments)
Tags: программирование, ссылки
Subscribe

  • Загонная охота: завершение

    Пофиксил сегодня баг, о котором писал здесь. Ошибка оказалась не в асемблере, как я думал, а в формировании байтиков. При пересчёте длины новая…

  • Прикопаю ссылки

    Нашёл интересный русскоязычный программерский Телеграм-канал и англоязычный сайт его автора с частичным дублированием контента. This entry was…

  • Это была славная охота

    Только что поучаствовал в загонной охоте на вот этот баг. Программисты оценят. This entry was originally posted at…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 26 comments

  • Загонная охота: завершение

    Пофиксил сегодня баг, о котором писал здесь. Ошибка оказалась не в асемблере, как я думал, а в формировании байтиков. При пересчёте длины новая…

  • Прикопаю ссылки

    Нашёл интересный русскоязычный программерский Телеграм-канал и англоязычный сайт его автора с частичным дублированием контента. This entry was…

  • Это была славная охота

    Только что поучаствовал в загонной охоте на вот этот баг. Программисты оценят. This entry was originally posted at…