История изменений
Исправление wandrien, (текущая версия) :
Да, вроде бы довольно очевидная вещь любому, кто хоть раз изучал листинги генерируемого кода.
Я, кстати, встречал приколы поинтереснее.
Есть экспортируемая из модуля функция, которая вызывает static функцию примерно вот так:
static int foo(int a, int b, int c, int d)
{
... /* тут куча кода */
return blabla;
}
int bar(int a, int b, int d)
{
return foo(a, b, some_const, d);
}
Что делает gcc? Первое - он назначает для foo типа вызова fastcall. Второе - в коде bar он переставляет аргументы прямо на стеке, ну а часть аргументов вообще идут в регистрах. (Дело на 32-битной x86 машине было.) И дальше делает jmp _foo
.
А потом программист (я) смотрит на коре дамп и понять не может, почему выше по стеку вызов foo был, вызов bar тоже был, а на стеке корректного фрейма ни для bar, ни для foo нигде нет.
Исправление wandrien, :
Да, вроде бы довольно очевидная вещь любому, кто хоть раз изучал листинги генерируемого кода.
Я, кстати, встречал приколы поинтереснее.
Есть экспортируемая из модуля функция, которая вызывает static функцию примерно вот так:
static int foo(int a, int b, int c, int d)
{
... /* тут куча кода */
return blabla;
}
int bar(int a, int b, int d)
{
return foo(a, b, some_const, d);
}
Что делает gcc? Первое - он назначает для foo типа вызова fastcall. Второе - в коде bar он переставляет аргументы прямо на стеке, ну а часть аргументов вообще идут в регистрах. (Дело на 32-битной x86 машине было.) И дальше делает jmp _foo
.
А потом программист (я) смотрит на коре дамп и понять не может, почему выше по стеку вызов foo бы, вызов bar тоже был, а на стеке корректного фрейма ни для bar, ни для foo нигде нет.
Исправление wandrien, :
Да, вроде бы довольно очевидная вещь любому, кто хоть раз изучал листинги генерируемого кода.
Я, кстати, встречал приколы поинтереснее.
Есть экспортируемая из модуля функция, которая вызывает static функцию примерно вот так:
static int foo(int a, int b, int c, int d)
{
... /* тут куча кода */
return blabla;
}
int bar(int a, int b, int d)
{
return foo(a, b, some_const, d);
}
Что делает gcc? Первое - он назначает для foo типа вызова fastcall. Второе - в коде bar он переставляет аргументы прямо на стеке, ну а часть аргументов вообще идут в регистрах. И дальше делает jmp _foo
.
А потом программист (я) смотрит на коре дамп и понять не может, почему выше по стеку вызов foo бы, вызов bar тоже был, а на стеке корректного фрейма ни для bar, ни для foo нигде нет.
Исходная версия wandrien, :
Да, вроде бы довольно очевидная вещь любому, кто хоть раз изучал листинги генерируемого кода.
Я, кстати, встречал приколы поинтереснее.
Есть экспортируемая из модуля функция, которая вызывает static функцию примерно вот так:
static int foo(int a, int b, int c, int d)
{
...
return blabla;
}
int bar(int a, int b, int d)
{
return foo(a, b, some_const, d);
}
Что делает gcc? Первое - он назначает для foo типа вызова fastcall. Второе - в коде bar он переставляет аргументы прямо на стеке, ну а часть аргументов вообще идут в регистрах. И дальше делает jmp _foo
.
А потом программист (я) смотрит на коре дамп и понять не может, почему выше по стеку вызов foo бы, вызов bar тоже был, а на стеке корректного фрейма ни для bar, ни для foo нигде нет.