2013-07-25 27 views
0

valgrind在ioctl()行上給我出現以下錯誤: 我不知道如何避免這種錯誤。valgrind在ioctl()調用中發生錯誤,同時發送一條I2C消息

== 2764 ==錯誤摘要:
== 2764 ==
== 2764 ==在1上下文1 1個錯誤:
:從1個上下文(0 0抑制)1個錯誤== 2764 == 系統調用PARAM的ioctl(I2C_RDWR).msgs指向未初始化字節(一個或多個)
== 2764 ==在0x4E08EFEC:的ioctl(系統調用-template.S:81)
== 2764 ==由0x871F:imxSend_i2cMsg(imx6qi2c_wrapper.c:84)
== 2764 == by 0x87CB:imxSend_i2cByte(imx6qi2c_wrapper.c:84)
== 2764 ==由0x86D3:主(imx6qi2c_test.c:30)
== 2764 ==地址0x7db99b82是線程1的堆棧
== 2764 ==未初始化值是由堆棧分配創建
== 2764 ==在0x875C:imxSend_i2cByte(imx6qi2c_wrapper.c:66)

在imx6qi2c_wrapper.c的代碼如下:

int imxSend_i2cMsg(const int i2c_fd, 
        struct i2c_msg *i2cMsgArray,   
        const unsigned int arraySize){ 
    int ret=0; 
    struct i2c_rdwr_ioctl_data ioctl_pack; 

    ioctl_pack.nmsgs=arraySize; 
    ioctl_pack.msgs=i2cMsgArray; 

    ret=ioctl(i2c_fd,I2C_RDWR,&ioctl_pack); 

    return ret; 
} 

和 「i2cMsgArray」 在annother功能本地聲明。

int imxSend_i2cByte(const int i2c_fd, 
         const unsigned char i2cAddress, 
         const unsigned char devRegister, 
         const unsigned char value){ 
    struct i2c_msg i2cmsg[I2CMSGS_TOTAL_WR]; 
    int ret=0,i=0; 

    for (i=0;i<I2CMSGS_TOTAL_WR;i++){ 
     i2cmsg[i].buf=malloc(2*sizeof(char)); 
    } 

    i2cmsg[0].addr=i2cAddress; 
    i2cmsg[0].flags=I2C_M_WR; 
    i2cmsg[0].len=2; 
    i2cmsg[0].buf[0]=devRegister; 
    i2cmsg[0].buf[1]=value; 

    ret=imxSend_i2cMsg(i2c_fd,&i2cmsg[0],I2CMSGS_TOTAL_WR); 
    if (ret<0){ 
     printf("i2cmsg failed.errno is %d, %s\n",errno,strerror(errno)); 
    } 

    for (i=0;i<I2CMSGS_TOTAL_WR;i++){ 
     free(i2cmsg[i].buf); 
    } 
    return ret; 
} 

其中是未初始化的字節?

+2

是不是所有'i2cmsg [1]的內存.. i2cmsg [I2CMSGS_TOTAL_WR-1]'未初始化?您初始化'i2cmsg [0]',但不是任何後續元素。 – simonc

+1

'i2cmsg'上的'memset'設置爲0將解決您的問題。 –

+0

是的,確實如此。謝謝 – nass

回答

0

好吧,只是爲了完成我在這裏複製給出的評論作爲評論(但從未張貼爲知道答案的用戶的答案)。

memset to 0 on i2cmsg will solve your problem