The*_*e-Q 2 c c++ function-pointers calling-convention
请考虑以下代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,类型(test_func_t)被定义为具有3个int参数的函数.函数指针(func)被赋予一个指向"print_integer"的指针,该指针只接收一个参数,然后用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>
Run Code Online (Sandbox Code Playgroud)
如您所见,其余参数([ebp + 0x12]和[ebp + 0x16])根本就没有使用过.
我的问题:
这种用法的示例:node.js的NODE_MODULE注册一个类型有3个参数[exports,module,priv] 的函数.它用这3个调用,但正式的例子显示了一个带有1或2个参数的函数的注册.
Pao*_*o M 12
引用C++ 11标准expr.reinterpret.cast 6:
函数指针可以显式转换为不同类型的函数指针.通过指向函数类型(8.3.5)的函数调用函数的效果 是未定义的,该函数类型与函数定义中使用的类型不同.
所以,我要说,这是不一般的安全.这是未定义的行为.也就是说,我不知道在这种情况下C++的其他实现如何表现.
| 归档时间: |
|
| 查看次数: |
666 次 |
| 最近记录: |