如果我知道它的帧指针和返回地址,有没有办法知道发送给函数的参数的分配空间大小是什么?
(最好不使用调试符号)
答案 0 :(得分:2)
一般来说,没有。首先,你不知道调用约定,所以你不知道参数是如何传递的,以及谁应该清理它们。即使你确实知道召唤惯例,我也不相信有一种简单的方法可以确定你的要求。
答案 1 :(得分:0)
你通常会看到像
这样的功能myFunction(char* buffer, int bufferSize, ...) { ... }
不将大小作为第二个参数(或在结构中)发送,您无法确定分配的空间。但如果这是一个字符串或另一个具有重要分隔符的字节数组,则可以检查大小(而不是分配的空间)。
编辑:要获取参数大小,您需要使用va_list
,va_start
,va_arg
,va_end
库函数。
http://www.cplusplus.com/reference/clibrary/cstdarg/va_list/
答案 2 :(得分:0)
如果所有数据都在堆栈上分配,那么对于函数foo(par1,par2,...,par10),参数par1,...,par9的大小应为((long)& par10) - ((长)& par1)。
您可以在参数列表的末尾添加一个虚拟参数,这样您就可以确定所有实际参数的大小。