0

valgrind は ioctl() の行で次のエラーを表示しています: このようなエラーを回避する方法がわかりません。

==2764== エラーの概要: 1 つのコンテキストから 1 つのエラー (抑制: 0 から 0)
==2764==
==2764== 1 のコンテキスト 1 で 1 つのエラー:
==2764== Syscall param ioctl(I2C_RDWR)。 msgs は、0x4E08EFEC で初期化されていないバイト
==2764== を指します: ioctl (syscall-template.S:81)
==2764== by 0x871F: imxSend_i2cMsg (imx6qi2c_wrapper.c:54)
==2764== by 0x87CB: imxSend_i2cByte (imx6qi2c_wrapper.c:84)
==2764== by 0x86D3: main (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」は別の関数でローカルに宣言されています。

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;
}

初期化されていないバイトはどこにありますか?

4

1 に答える 1