LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2199|回复: 7

return type of 'main' is not 'int' 请问这是什么错误??

[复制链接]
发表于 2004-7-21 20:51:34 | 显示全部楼层 |阅读模式
就是这个小程序,堆栈溢出系列讲座里的

test.c
------------------------------------------------------------------------------

char shellcode[] =
        "\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
        "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
        "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
        "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";

void main() {
   int *ret;

   ret = (int *)&ret + 2;       //ret 等于main()的返回地址
                                //(+2是因为:有pushl ebp ,否则加1就可以了。)

   (*ret) = (int)shellcode;     //修改main()的返回地址为shellcode的开始地址。

}






然后我gcc -o test test.c
就提示说: In function 'main'
          return type of 'main' is not 'int'



请问是怎么回师??????
发表于 2004-7-22 08:14:19 | 显示全部楼层
听我一句话,先学好基础再来玩这个吧。
 楼主| 发表于 2004-7-22 10:18:42 | 显示全部楼层
你们都说学好基础,可是我问得都是基础的问题,却没人回答我,你们知道就告诉我呀,不知道是因为你们不会还是不屑与回答。我也正在学基础
不学这些,我怎么知道我该学什么基础的东西,
我是来提问题的,你们不知道就算了
发表于 2004-7-22 10:41:11 | 显示全部楼层
这种问题就算没有学过C,也该会自己看gcc的info吧。

`-Wmain'
     Warn if the type of `main' is suspicious.  `main' should be a
     function with external linkage, returning int, taking either zero
     arguments, two, or three arguments of appropriate types.
发表于 2004-7-22 20:42:41 | 显示全部楼层
最初由 午后阳光 发表
你们都说学好基础,可是我问得都是基础的问题,却没人回答我,你们知道就告诉我呀,不知道是因为你们不会还是不屑与回答。我也正在学基础
不学这些,我怎么知道我该学什么基础的东西,
我是来提问题的,你们不知道就算了

首先我作为版主得澄清一点:我相信你是真想学,但是又不得其门而入;同时我也相信其它兄弟并不是不想帮助你,也丝毫没有歧视你的意思,虽然有些人说的话可能不是很好听。
问题的关键在于,从你所提的问题可以看出来,你明显缺乏系统的、扎实的计算机理论知识基础。这种基础知识无论是在学校学习也好,自学也好,都是需要系统的学习才能培养建立起来的。论坛只能针对某个具体问题进行交流,而系统的学习是不可能靠在论坛问问题完成的。
如果你是计算机系的学生,不论学校好坏,经过四年的学习,都应该有一个大致的基础知识框架,到时候有问题到网上搜索或者到论坛交流一下,或者自己看书,就完全可以融会贯通。
如果你不是计算机专业的学生,那你就老老实实地把计算机专业的基础课程一本一本地认真看。开始可能很痛苦,但时间长了,好处自然就出来了。
你既然这么对缓冲区溢出感兴趣,建议你从汇编和C语言开始。C语言的教材当然就是C语言圣经了。至于汇编,我建议你直接在linux环境下学习AT&T格式的汇编。这本Programming from the Ground Up 是我强烈推荐的,正是看了它,我才搞明白缓冲溢出是怎么回事。书后面有一个从不同层次出发的学习顺序指导,建议你按照它建议的顺序去看书。
 楼主| 发表于 2004-7-23 09:26:58 | 显示全部楼层
我觉得可能是我没说清楚,你们可能觉得我看不懂这个错误提示
我是说就这个程序而言,main是void,怎么会有返回值
可是错误提示确实return type of 'main' is not 'int'


我提的就是具体问题,而且这个提示我也是先导网上搜,找不到才来这里提问的,
发表于 2004-7-23 09:49:10 | 显示全部楼层
上面有人回答过了,我再用汉语说一下
"main的返回值应该是int的"
不能是别的形式,不过写成void一般也能编译通过
但是会出warning: return type of 'main' is not 'int'
实际上,即便你写成void并且编译通过,main的返回值仍然是int的
发表于 2004-7-23 10:15:03 | 显示全部楼层
版主,就算是简单的问题,还是要回答的吧,这样,会把人吓跑的。呵呵(对事,不对人)
我来回答吧。

对于mian函数的形式,
学过谭老的C的人,都会认为
void main()是正常的,那是先入为主,(知识要不断更新的)
不过,我告诉你,那不适合unix下的c,也不符合标准。

在linux下,c 中main 的形式应该是这样的。

#include <stdlib.h> // include EXIT_SUCCESS and EXIT_FAILURE;

int main(int argc, char** argv)
{
....

return EXIT_SUCCESS; //or return EXIT_FAILURE 这样写是因为可移植性
}

另外,用gcc编译,最好始终使用-Wall 选项。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表