分配空间不足引起的错误:‘Stack smashing detected’

使用环境:ubuntu 11.10、C++

出错情景:

使用mysql执行一个query语句,以进行一个涉及多个表的联合查询(query语句比较长)

代码如下:

char query[128]={0};
sprintf(query, ".....");
...
return myList;
执行结束之后,返回一个list类型的值

#include <stdio.h> 
void func()
{
    char array[10];
    gets(array);
} 
int main(int argc, char **argv)
{
    func();
}

-fno-stack-protector 

while compiling.
In that case you will get a segmentation fault if you try to access illegal memory location. and of course you can detect the point of overflow say for example using using valgrind.

但是,在执行完return语句时,弹出该错误:“** stack smashing detected ***:a.o terminated

寻找原因:

问题很奇怪,在return的时候返回,按说应该是正常的执行,没什么问题的呀。。。

在网上查到类似的错误不多,但找到一篇很有用的:http://stackoverflow.com/questions/1345670/stack-smashing-detected

原文如下:

Stack Smashing is actually a protection mechanism used by gcc to detect buffer overflow attacks.

An input of string greater than size 10 causes corruption of gcc inbuilt protection canary variable followed by SIGABRT to terminate the program.

You can disable this protection of gcc using option

即:stack smashing是GCC的一种检测“缓存溢出”的保护机制

并举例:如果在gets(array); 中,输入多于10个char,就会导致stack smashing错误

问题解决:

由于query语句比较长,所以也没检查char query[128]是否够用

在修改了query字符数组的长度为255之后,发现问题解决...

小结:

不只是在Linux下,在Windows下也有同样的状况。当分配的内存不够时,会继续执行;但是在程序结束返回时才出现错误提示。


About“*** stack smashing detected ***”error

11-30

问题是这样的:rn在开发一个小程序时,在源程序源代码目录下经过./configure,make,make install成功后,运行一切正常。rn然后做成rpm包,再安装(-ivh,--nodeps,--force)运行后出现错误如下:rn。。。rn*** stack smashing detected ***: my_program terminatedrnPID 2803: received a signal=6rn。。。rn对应程序如下:rnKNOWLA_INFO_t knowla_data;rnint config_info_query(char *mod_name, CFG_INFO_t *pmd)rnrn char hostname[HOSTLENGTH];rn int port=0;rn int retVal = 0;rnrn if ( NULL == mod_name)rn rn PRINT("config_info_query: invalid parameters!\n");rn retVal = -1;rn goto out; rn rn CONF_STR_CONFIG host_conf_array[] = rn "host", hostname,rn 0, 0rn ;rn CONF_INT_CONFIG port_int_array[] = rn "port", &port,rn 0, 0rn ;rn rn set_conf_file(CONF_FILE);rnrn if (load_conf(NULL, mod_name, port_int_array, host_conf_array) != 0) rn WLOG_ERR("load configure failed!");rn return MOD_CONF_ERR;rn rn rn strcpy(pmd->hostname,hostname);rn pmd->port = port; rn rn PRINT("cfg_info_query: hostname is: %s,port is :%d\n",pmd->hostname,pmd->port);rn PRINT("main:=====================test log0000000000\n");rn rn out:rn return retVal;rnrnint main()rnrn ...rn 1. memset(&knowla_data,0x00,sizeof(KNOWLA_INFO_t)); rn2. knowla_data.port = 0;rn3, PRINT("main:before caoo knowla_info_query,test log=================\n");rn4. retVal = knowla_info_query("knowla_cfg", &knowla_data);rn5. PRINT("The knowla_data is %s,%d\n",knowla_data.hostname,knowla_data.port);rn6. PRINT("main:=====================test log=================\n");rnrn其中,knowla_data为一结构体变量。rn最后安装rpm后运行的时候连第5句都没有打印出来,说明在main函数中,当调用完第4句的时候就出错了。rnrn是不是说的“栈破碎”就是调用这个函数的时候出错的?rnrn请高手给看看,非常感谢!!rn

没有更多推荐了,返回首页