当前位置: 技术问答>linux和unix
About“*** stack smashing detected ***”error
来源: 互联网 发布时间:2017-02-02
本文导语: 问题是这样的: 在开发一个小程序时,在源程序源代码目录下经过./configure,make,make install成功后,运行一切正常。 然后做成rpm包,再安装(-ivh,--nodeps,--force)运行后出现错误如下: 。。。 *** stack smashing detected ***...
问题是这样的:
在开发一个小程序时,在源程序源代码目录下经过./configure,make,make install成功后,运行一切正常。
然后做成rpm包,再安装(-ivh,--nodeps,--force)运行后出现错误如下:
。。。
*** stack smashing detected ***: my_program terminated
PID 2803: received a signal=6
。。。
对应程序如下:
KNOWLA_INFO_t knowla_data;
int config_info_query(char *mod_name, CFG_INFO_t *pmd)
{
char hostname[HOSTLENGTH];
int port=0;
int retVal = 0;
if ( NULL == mod_name)
{
PRINT("config_info_query: invalid parameters!n");
retVal = -1;
goto out;
}
CONF_STR_CONFIG host_conf_array[] = {
{"host", hostname},
{0, 0}
};
CONF_INT_CONFIG port_int_array[] = {
{"port", &port},
{0, 0}
};
set_conf_file(CONF_FILE);
if (load_conf(NULL, mod_name, port_int_array, host_conf_array) != 0) {
WLOG_ERR("load configure failed!");
return MOD_CONF_ERR;
}
strcpy(pmd->hostname,hostname);
pmd->port = port;
PRINT("cfg_info_query: hostname is: %s,port is :%dn",pmd->hostname,pmd->port);
PRINT("main:=====================test log0000000000n");
out:
return retVal;
}
int main()
{
...
1. memset(&knowla_data,0x00,sizeof(KNOWLA_INFO_t));
2. knowla_data.port = 0;
3, PRINT("main:before caoo knowla_info_query,test log=================n");
4. retVal = knowla_info_query("knowla_cfg", &knowla_data);
5. PRINT("The knowla_data is %s,%dn",knowla_data.hostname,knowla_data.port);
6. PRINT("main:=====================test log=================n");
}
其中,knowla_data为一结构体变量。
最后安装rpm后运行的时候连第5句都没有打印出来,说明在main函数中,当调用完第4句的时候就出错了。
是不是说的“栈破碎”就是调用这个函数的时候出错的?
请高手给看看,非常感谢!!
在开发一个小程序时,在源程序源代码目录下经过./configure,make,make install成功后,运行一切正常。
然后做成rpm包,再安装(-ivh,--nodeps,--force)运行后出现错误如下:
。。。
*** stack smashing detected ***: my_program terminated
PID 2803: received a signal=6
。。。
对应程序如下:
KNOWLA_INFO_t knowla_data;
int config_info_query(char *mod_name, CFG_INFO_t *pmd)
{
char hostname[HOSTLENGTH];
int port=0;
int retVal = 0;
if ( NULL == mod_name)
{
PRINT("config_info_query: invalid parameters!n");
retVal = -1;
goto out;
}
CONF_STR_CONFIG host_conf_array[] = {
{"host", hostname},
{0, 0}
};
CONF_INT_CONFIG port_int_array[] = {
{"port", &port},
{0, 0}
};
set_conf_file(CONF_FILE);
if (load_conf(NULL, mod_name, port_int_array, host_conf_array) != 0) {
WLOG_ERR("load configure failed!");
return MOD_CONF_ERR;
}
strcpy(pmd->hostname,hostname);
pmd->port = port;
PRINT("cfg_info_query: hostname is: %s,port is :%dn",pmd->hostname,pmd->port);
PRINT("main:=====================test log0000000000n");
out:
return retVal;
}
int main()
{
...
1. memset(&knowla_data,0x00,sizeof(KNOWLA_INFO_t));
2. knowla_data.port = 0;
3, PRINT("main:before caoo knowla_info_query,test log=================n");
4. retVal = knowla_info_query("knowla_cfg", &knowla_data);
5. PRINT("The knowla_data is %s,%dn",knowla_data.hostname,knowla_data.port);
6. PRINT("main:=====================test log=================n");
}
其中,knowla_data为一结构体变量。
最后安装rpm后运行的时候连第5句都没有打印出来,说明在main函数中,当调用完第4句的时候就出错了。
是不是说的“栈破碎”就是调用这个函数的时候出错的?
请高手给看看,非常感谢!!
|
这个现象看起来像是栈溢出,也就是说给数组hostname写入的时候越界,破坏了栈上的关键内容(比如返回地址)
config_info_query这个函数里面没有直接修改hostname, 但是把它的地址给了host_conf_array, 所以很可能是load_conf这个函数里面修改host_conf_array的时候越界。
建议:
1. 定义数组hostname的时候把空间多扩大一点, 看看还有没有错误
2. 在调用load_conf之前之后加上PRINT,看看是不是这里的问题
3. 检查load_conf的代码,看看他给host_conf_array里面写了多少字节,会不会超过HOSTLENGTH
config_info_query这个函数里面没有直接修改hostname, 但是把它的地址给了host_conf_array, 所以很可能是load_conf这个函数里面修改host_conf_array的时候越界。
建议:
1. 定义数组hostname的时候把空间多扩大一点, 看看还有没有错误
2. 在调用load_conf之前之后加上PRINT,看看是不是这里的问题
3. 检查load_conf的代码,看看他给host_conf_array里面写了多少字节,会不会超过HOSTLENGTH
|
你的问题可能发生在这2个地方
一般来说是第一个函数里面内存越界了导致的,再跟第一个函数看看
load_conf(NULL, mod_name, port_int_array, host_conf_array)
strcpy(pmd->hostname,hostname);
一般来说是第一个函数里面内存越界了导致的,再跟第一个函数看看
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。