Segmentation fault报错

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;
}

黑客技术中有一种缓冲区溢出攻击,就是应用的这个原理,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。  

猜你喜欢

转载自blog.csdn.net/bdqx_007/article/details/2079779