首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将void(char*)函数作为void(void)执行

将void(char*)函数作为void(void)执行
EN

Stack Overflow用户
提问于 2012-09-27 09:43:54
回答 1查看 1.6K关注 0票数 0
代码语言:javascript
复制
void print( char * str ){ printf("%s",str); }

void some_function(){
    ... Loads a file into `char * buffer` ...
    ... Stores the function print before `buffer` address ...
    ((void(*)(void))buffer();
}

在该文件中,有一个"Hello World“,以及一些无法读取的字符。执行缓冲区将打印"Hello World“。

我知道你可以像这样执行一个指针:

代码语言:javascript
复制
void (*foo)(int) = &bar; // such that void bar(int)
(*foo)(123);

但是在内存中执行void(int)函数作为void(void)函数以及它的函数和参数对我来说还是个新鲜事。

有没有一个标准来描述函数在内存中的样子(比如一个字符串以空字符结尾),这样你就可以这样执行它了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-27 10:58:44

在内存中执行

(Int)函数作为空(空)函数以及它的函数和参数对我来说是新的。

好的。这是一种未定义的行为,你永远不应该这样做。它可能碰巧在某些实现上起作用,但不能保证结果。

有没有一个标准来描述函数在内存中的样子(比如字符串以空字符结尾),这样你就可以这样执行它了吗?

不,没有。更重要的是,没有关于如何将参数传递给函数的标准--它取决于实现,也没有要求以这样的方式实现它,即不同类型的函数是兼容的。

但在这种情况下,程序员正在利用内存中函数的外观知识,并以这样的方式准备文件,使其在加载到内存中并在此特定实现中运行时执行正确的操作。毕竟,这就是装载器要做的事情。它们将程序从文件读取到内存中,然后执行它们。利用程序中的错误将恶意代码加载到程序的内存中并让程序执行它的攻击者也会使用此方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12612914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档