小编cit*_*ane的帖子

为什么将"extern puts"转换为函数指针"(void(*)(char*))&puts"?

我正在查看来自不安全编程的示例abo3.c,并且我没有在下面的示例中讨论转换.有人可以开导我吗?

int main(int argv,char **argc)   
{  
    extern system,puts;  
    void (*fn)(char*)=(void(*)(char*))&system;  
    char buf[256];  

    fn=(void(*)(char*))&puts;  
    strcpy(buf,argc[1]);  
    fn(argc[2]);  
    exit(1);  
}
Run Code Online (Sandbox Code Playgroud)

那么 - 系统的投射和投注是什么?他们都回归了int,为什么要把它变成无效?

我非常感谢对整个计划的解释.

[编辑]
感谢您的投入!

Jonathan Leffler,实际上代码有"坏"的原因.它应该是可利用的,溢出缓冲区和函数指针等.mishou.org有一篇关于如何利用上述代码的博客文章.其中很多仍然在我头上.

bta,我从上面的博客文章中得知,转换系统会以某种方式阻止链接器删除它.

有一点不能立即明确的是系统和放置地址都写在同一个位置,我想这可能是gera所说的"所以链接器不会删除它".

虽然我们讨论的是函数指针的主题,但现在我想问一个后续问题,即语法更清晰.我正在使用函数指针查看一些更高级的示例,并偶然发现这个可憎的东西,取自托管shellcode的站点.

#include <stdio.h>

char shellcode[] = "some shellcode";

int main(void)
{
    fprintf(stdout,"Length: %d\n",strlen(shellcode));
    (*(void(*)()) shellcode)();
}

所以数组被强制转换为函数返回void,引用和调用?这看起来很讨厌 - 所以上面代码的目的是什么?

[/编辑]

c casting function-pointers void shellcode

7
推荐指数
1
解决办法
6812
查看次数

无法专门化功能模板

这是家庭作业,虽然已经提交了不同的方法.

我从Visual Studio 2008获得以下内容

error C2893: Failed to specialize function template 'void std::sort(_RanIt,_RanIt,_Pr)'

代码如下

main.cpp
    Database<> db; 
    db.loadDatabase();
    db.sortDatabase(sort_by_title());  

Database.cpp
void Database<C>::sortDatabase(const sort_by &s) { 
    std::sort(db_.begin(), db_.end(), s); 
}

并且函数对象被定义为

struct sort_by : public std::binary_function<const Media *, const Media *, bool> { 
    virtual bool operator()(const Media *l, const Media *r) const = 0;
};

struct sort_by_title : public sort_by {
    bool operator()(const Media *l, const Media *r) const { ... }
};
...

这里有什么治疗方法?

[编辑]对不起,也许我应该明确继承

template <typename C = std::vector<Media …

c++ inheritance functor specialization template-specialization

5
推荐指数
1
解决办法
3103
查看次数

STL迭代器进入构造函数

我想知道如何编写一个接受任何STL输入迭代器的自定义类(在本例中是一个链表)的构造函数.我已经创建了一个与我的List类绑定的自定义Iterator类.

这很好用.

template <typename T>  
List<T>::List(Iterator beg, Iterator end) : first_(0) {  
    while (beg != end)  
        insertLast(*beg++);
}
Run Code Online (Sandbox Code Playgroud)

我已经设法创建一个接收这样的列表迭代器的构造函数.

List<T>::List(typename list<T>::iterator s, typename list<T>::iterator e) :
    first_(0) {  
    while (s != e)   
        insertLast(*s++);
Run Code Online (Sandbox Code Playgroud)

我的STL-fu对于如何将其概括为接受任何输入迭代器并没有真正意义上的
任何帮助吗?

谢谢!

c++ constructor iterator stl

1
推荐指数
1
解决办法
2085
查看次数