Segmentation fault报错
从字面上来翻译叫做分段错误.这个错误是由于访问了非法内存地址而引起的,因此,产生这个错误的原因就可能是以下几种:
1,数组越界.
这个很好理解,就是本来只定义了一个char s[10]的数组,却在程序中访问了s[10].当然在程序中若出现问题是不可能这么显而易见的.
2,访问空,野指针或未被初始化的指针.
空指针是指值为NULL的指针,不指向任何内存;
野指针是指值不确定的指针,指向不确定的内存;
未被初始化的指针和野指针一样,其值是不确定的.
用一个处理文件的例子来说明:
这个程序是想计算文件中有多少行含有字符'#'
#include
/*假定文件的每一行最大长度不超过300*/
#define BUFF_LINE 300
int main()
{
char FileCont[BUFF_LINE];
char* str=FileCont;
int couter=0;
FILE* fp;
if ( (fp = fopen( "file_refer.cfg", "r" ) ) == NULL)
{
printf( "File could not be opened/n" );
exit(0);
}
fgets(str,BUFF_LINE,fp);
while(!feof(fp))
{
/*处理每一行*/
while(*str!='/0')
{
if (*str=='#')
{
couter++;
break;
}
else
str++;
}
//str=FileCount;
fgets(str,BUFF_LINE,fp);
}
fclose(fp);
printf("%d",couter);
return 0;
}
这个程序看起来没什么问题,而且很有可能运行正确(当文件小的情况下),可是一旦文件长度超过300的时候,就可能会出问题了.300?不是定义的允许一行的长度么?怎么变成文件长度了?原因在于在处理一行之后,并没有将指针str的值重置为数组FileCont的开始.而是指向了FileCont加上若干长度的地址(一行的长度或者是到一行开始到'#'的长度).这样一旦文件的行数很多,总长度很长,那么str就会越过数组的边界访问非法的内存地址.
me:
void * process_request(void*soap)
{
pthread_detach(pthread_self());
soap_serve((struct soap*)soap);
/* if ((soap_serve((struct soap*)soap)) != SOAP_OK)
{ //此处出错产生了Segmentation fault报错 可能是因为stderr的原因
soap_print_fault(&soap,stderr);
printf("soap server failed/n");
}*/
soap_destroy((struct soap*)soap);
soap_end((struct soap*)soap);
/* soap_free((struct soap*)soap);*/
soap_done((struct soap*)soap);
free(soap);
return NULL;
}
黑客技术中有一种缓冲区溢出攻击,就是应用的这个原理,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。