首页
社区
课程
招聘
[讨论]LIUNX下写CGI程序因为经常内存溢出
发表于: 2007-9-11 21:14 4807

[讨论]LIUNX下写CGI程序因为经常内存溢出

2007-9-11 21:14
4807
最近在LIUNX下写CGI程序因为经常内存溢出,就想了个方法用函数来避免问题的发生以下是读字符串函数
char *read_str(int fp,int len)

{

        char *str=NULL;

        read(fp,str,len);

        return str;

}
以下是输出函数
void poslist()

{

printf("<form action=\"\" method=\"post\">\

<table align=\"center\" width=\"654\" border=\"0\">\

  <tr>\

    <td align=\"center\" colspan=\"3\">位置列表</td>\

  </tr>\

  <tr>\

    <td width=\"170\">名称</td>\

    <td width=\"129\">值</td>\

    <td width=\"341\">操作</td>\

  </tr>");
char *POS_NAME,*POS_VALUE;
int i=0,j=0,fp=open("test.txt",O_RDWR|O_CREAT,00700);//LINUX附加文件没有办法从指定位置写吗!

struct stat buf;

fstat(fp,&buf);

while(i<=buf.st_size){
lseek(fp,i,0);  
//read(fp,&POS_NAME,8);直接read会溢出
//read(fp,&POS_VALUE,2);
POS_NAME=read_str(&fp,8);//-------无输出调用时出错
POS_VALUE=read_str(&fp,2);

printf("<tr>\

    <td><input name=\"pn%d\" size=\"32\" type=\"hidden\">\

      %s</td>\

    <td><input name=\"pv%d\" size=\"32\" type=\"hidden\">\

    %s</td>\

    <td><a href=\"%s\">编辑</a>/<a href=\"%s\">删除</a></td>\

  </tr>",j,POS_NAME,j,POS_VALUE,POS_VALUE,POS_VALUE);
j++;i+=10;

}
close(fp);

printf("</table></form>");

}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 161
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PFC
2
没人回吗!沙发自己做了
2007-9-12 15:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
char *read_str(int fp,int len)

{

  char *str=NULL;

  read(fp,str,len);

  return str;

}
你返回的是局部变量,禁止这样使用。因为局部变量调用完后就销毁了
2007-9-12 18:21
0
雪    币: 161
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PFC
4
这个函数的返回值是char *字符串。不是void
应该和局部变量无关吧
2007-9-13 08:25
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我也同意这个看法,str在stack是esp-4,函数返回的时候stack要恢复到以前的状态,即nov esp, ebp.你返回一个已经无效的地址,当然要出错。还有种可能编译器把局部变量放到寄存器中,这样的话,这个程序就不会出错。不过最好别在函数里返回一个局部变量。举个列子,GetWindowThreadProcessId(hwnd, pid)pid就是一个典型的out参数,使用前它并没有初值,作用只是作为函数修改了PID结果后的一个输出参数。当GetWindowThreadProcessId调用完成后,hwnd窗口所对应的PID。
同样的道理,所以str应该作为参数输入,这样就没问题了。
2007-9-16 18:05
0
雪    币: 161
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PFC
6
在函数里定义局部变量做返回是可以的。不过如果连续多次调用这个函数那么参数那么最后一个值将将是所有指南它的指针的值。

问题以解决。
char *POS_NAME,*POS_VALUE;
int i=0,j=0,fp=open("test.txt",O_RDWR|O_CREAT,00700);

struct stat buf;

fstat(fp,&buf);

while(i<=buf.st_size){
lseek(fp,i,0);  
//read(fp,&POS_NAME,8);直接read会溢出
//read(fp,&POS_VALUE,2);
POS_NAME=read_str(&fp,8);//-------第一次调用
POS_VALUE=read_str(&fp,2);//-------第二次调用

最终返回值 POS_NAME相等于POS_VALUE都 指向同一个字符串
2007-9-16 19:16
0
游客
登录 | 注册 方可回帖
返回
//