码迷,mamicode.com
首页 > 其他好文 > 详细

GCC 4.6.3段错误(核心已转储)

时间:2016-05-13 00:53:09      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

//串口相关的头文件
#include <stdio.h>      /*标准输入输出定义*/
#include <stdlib.h>     /*标准函数库定义*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>      /*文件控制定义*/
#include <unistd.h>     /*标准输入输出定义*/
#include <errno.h>      /*错误号定义*/
#include <termios.h>    /*POSIX终端控制定义*/
#include <sys/time.h>
#include <time.h>
#include <string.h>
#include <sys/select.h>
#include <math.h>

#ifdef __cplusplus //跨平台定义方法
extern "C" {
#endif

#define FALSE     -1
#define TRUE    0
#define RS_OPEN_ERR 0

#define RX_UART_NO_ERR  0
#define RX_UART_TIME_OUT 1
#define RX_UART_ERR      2

#define RX_NO_ERR  0
#define RX_PRA_ERR 1
#define RX_NO_data 2
#define RX_NO_MATH_ADDR 3
#define ENCODERSIGVAL 1048576//2^20
#define M 5
#define N 10

char Opera[5][10]=
    {
        {0x01,0x40,0x00,0x06,0x20,0x00,0x00,0x00,0x00,0x00},
        {0x01,0x40,0x00,0x06,0x20,0x00,0x20,0x02,0x00,0x00},
        {0x01,0x40,0x00,0x06,0x20,0x01,0x00,0x01,0x00,0x00},
        {0x01,0x40,0x00,0x03,0xE6,0x00,0x00,0x03,0x00,0x00},
        {0x01,0x40,0x00,0x03,0xE5,0x0A,0x00,0x01,0x00,0x00},
    }; //绝对值编码器的圈量,连续读取3Byte(绝对值编码器1Byte,1圈内脉冲数2Byte)



void MEMODBUSCRC(char *DATA,int NUMCNT,char *CRCLOW,char *CRCHIGH) //计算CRC值
{
    short int CRC;
    short int i=0;
    short int num=0;
    CRC=0xFFFF;
    for(num=0;num<NUMCNT;num++)
    {
//      CRC^=(DATA[num]&0x00FF);
    CRC^=(*(reinterpret_cast<char*>(&DATA[num]))&0x00FF);
      for(i=0;i<8;i++)
      {
          if(CRC&0x01) //如果移出位为1,则将CRC与A001相异或,A001为RTU模式校验多项式
          {
             CRC>>=1;
             CRC&=0x7FFF;
             CRC^=0xA001;
          }
          else
          {
             CRC>>=1;
             CRC&=0x7FFF;
          }
      }
    }
    *CRCHIGH=CRC>>8&0xFF;
    *CRCLOW=CRC&0xFF;
    printf("%c\n",*CRCHIGH);
    printf("%c\n",*CRCLOW);   
}

int  main(int argc,char **argv)
{
    unsigned int OperaOrder;
    int i;
    char  CRCHIGH;
    char CRCLOW;
    char FrameCode[10];
    MEMODBUSCRC(&Opera[OperaOrder][0],8,&CRCLOW,&CRCHIGH);//计算CRC校验值
 
//    printf("FrameCode[i]=%c",FrameCode[i]);   
}      
#ifdef __cplusplus
}

#endif

在ubuntu 12.0.4上用gcc4.6.3通过g++ a.c -o a -Wall -fexecptions -O2报错,估计是ubuntu加了越界检查,但是在gcc4.8以上的版本却没有问题,通过gdb调试发现原因是因为unsigned int OperaOrder未初始化,将其初始化为0则通过。

修改后的代码如下:

//串口相关的头文件
#include <stdio.h>      /*标准输入输出定义*/
#include <stdlib.h>     /*标准函数库定义*/
#include <sys
技术分享pes.h>
#include <sys/stat.h>
#include <fcntl.h>      /*文件控制定义*/
#include <unistd.h>     /*标准输入输出定义*/
#include <errno.h>      /*错误号定义*/
//#include <termios.h>    /*POSIX终端控制定义*/
#include <sys/time.h>
#include <time.h>
#include <string.h>
//#include <sys
技术分享lect.h>
#include <math.h>

#ifdef __cplusplus //跨平台定义方法
extern "C" {
#endif

#define FALSE     -1
#define TRUE    0
#define RS_OPEN_ERR 0

#define RX_UART_NO_ERR  0
#define RX_UART_TIME_OUT 1
#define RX_UART_ERR      2

#define RX_NO_ERR  0
#define RX_PRA_ERR 1
#define RX_NO_data 2
#define RX_NO_MATH_ADDR 3
#define ENCODERSIGVAL 1048576//2^20
#define M 5
#define N 10

/
技术分享ar Opera[5][10]=
//    {
//        {0x01,0x40,0x00,0x06,0x20,0x00,0x00,0x00,0x00,0x0
0},
//        {0x01,0x40,0x00,0x06,0x20,0x00,0x20,0x02,0x00,0x00},
//        {0x01,0x40,0x00,0x06,0x20,0x01,0x00,0x01,0x00,0x00},
//        {0x01,0x40,0x00,0x03,0xE6,0x00,0x00,0x03,0x00,0x00},
//        {0x01,0x40,0x00,0x03,0xE5,0x0A,0x00,0x01,0x00,0x00},
//    }; //绝对值编码器的圈量,连续读取3Byte(绝对值编码器1Byte,1圈内脉冲数2Byte)

char Opera[5][10]=
    {
        {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a},
        {0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0
x13,0x14},
        {0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e},
        {0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28},
        {0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32},
    }; //绝对值编码器的圈量,连续读取3Byte(绝对值编码器1Byte,1圈内脉冲数2Byte)



void MEMODBUSCRC(char *DATA,int NUMCNT,char *CRCLOW,char *CRCHIGH) //计算CRC值
{
    short int CRC;
    short int i=0;
    short int num=0;
    CRC=0xFFFF;
    //*DATA = *DATA;
    for(num=0;num<
NUMCNT;num++)
    {
        printf("%d, %x\n", num, DATA[num]);
     CRC^=(DATA[num]&0x00FF);
    //CRC^=(*(reinterpret_cast<unsigned short*>(&DATA[num]))&0x00FF);
      for(i=0;i<8;i++)
      {
          if(CRC&0x01) //如果移出位为1,则将CRC与A001相异或,A001为RTU模式校验多项式
          {
             CRC>>=1;
             CRC&=0x7FFF;
             CRC^=0xA001;
          }
          else
          {
             CRC>>=1;
             CRC&=0x7FFF;
          }
      }
    
}
    *CRCHIGH=CRC>>8&0xFF;
    *CRCLOW=CRC&0xFF;
    printf("%d\n",*CRCHIGH);
    printf("%d\n",*CRCLOW);
}

int  main(int argc,char **argv)
{
    unsigned int OperaOrder = 100;
    int i = 0;
    char  CRCHIGH = 0;
    char CRCLOW = 0;

    //
    char FrameCode[10] = {0};
    MEMODBUSCRC(&Opera[OperaOrder][0],8,&CRCLOW,&CRCHIGH);//计算CRC校验值

//    printf("FrameCode[i]=%c",FrameCode[i]);
}
#ifdef __cplusplus
}
#endif

1,这个是OperaOrder = 100 能输出 但是是全0;

2,这个是正确的

技术分享

3,这个是未初始化的输出,数据时乱的,指向未知地址

技术分享

4,这个是这个是release版本的

技术分享

5,这个是OperaOrder = 10000 数组越界,说明gcc做了优化,促使分配的

技术分享

所以,一定要养成声明变量后初始化的习惯,有些编译器会帮忙初始化,但是不能保证所有的编译器都帮你。

GCC 4.6.3段错误(核心已转储)

标签:

原文地址:http://blog.csdn.net/kbwzy/article/details/51344475

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!