Вызов указателя на функцию, у которой назначенная функция имеет меньше аргументов, чем тип указателя

Рассмотрим следующий код:

#include <iostream>

typedef int (*test_func_t) (int, int, int);

int print_integer (int a)
{
    std::cout << "num: " << a << "\n";
    return a;
}

int main (int argc, char * argv[])
{
    test_func_t func = (test_func_t) &print_integer;
    std::cout << "calling with 3 parameters func(5,7,9)\n";
    func(5,7,9);
    return 0;
}

Как видите, тип (test_func_t) определяется как функция с 3 аргументами int. Указатель функции (func) назначается с указателем на «print_integer», который получает только 1 аргумент, а затем указатель функции вызывается с 3 аргументами (5, 7, 9).

Этот код работает и производит вывод "num: 5".

вывод gdb disas (синтаксис Intel)

disas main
...
   0x080486cb <+9>:     mov    DWORD PTR [esp+0x1c],0x804867d
...
   0x080486e0 <+37>:    mov    DWORD PTR [esp+0x8],0x9
   0x080486e8 <+45>:    mov    DWORD PTR [esp+0x4],0x7
   0x080486f0 <+53>:    mov    DWORD PTR [esp],0x5
   0x080486f7 <+60>:    mov    eax,DWORD PTR [esp+0x1c]
   0x080486fb <+64>:    call   eax

disas print_integer
   ...
   0x08048683 <+6>:     mov    DWORD PTR [esp+0x4],0x8048830
   0x0804868b <+14>:    mov    DWORD PTR [esp],0x8049ae0
   0x08048692 <+21>:    call   0x8048530 <std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)@plt>
   0x08048697 <+26>:    mov    edx,DWORD PTR [ebp+0x8]
   0x0804869a <+29>:    mov    DWORD PTR [esp+0x4],edx
   0x0804869e <+33>:    mov    DWORD PTR [esp],eax
   0x080486a1 <+36>:    call   0x80484d0 <std::ostream::operator<<(int)@plt>

Как видите, остальные аргументы ([ebp + 0x12] и [ebp + 0x16]) просто не используются.

Мои вопросы:

Похоже, это работает в Linux x86 с соглашением о вызовах __cdecl. Безопасно ли это для других архитектур и соглашений о вызовах?Разрешает ли какой-либо стандарт C / C ++ / определяет результат назначения указателя на функцию из функции, которая ожидает меньше аргументов?

Пример такого использования: node.jsNODE_MODULE регистрирует функцию, чьятип имеет 3 аргумента [export, module, priv]. этозвонил с этими 3 но формальные примеры показывают регистрацию функции с1 или же2 аргументы.

Ответы на вопрос(2)

Ваш ответ на вопрос