強制転換による疑惑

1941 ワード

int recv_message(sGsmRecvData *pRecvData)
{
    int  num = 0;
    int  Index = 0;
    unsigned char u8Ret = FALSE;
    
    printf_func_line();
    if((pRecvData == NULL) || (pRecvData->recv == NULL))
        return -1;

    num = pRecvData->recv(pRecvData->s32Fd, pRecvData->pStrData, pRecvData->s32PStrDataSize);
    
    if(num > 0)
    {
        printf("pRecvData->pStrData:%s
", pRecvData->pStrData); pRecvData->pStrData[pRecvData->s32PStrDataSize - 1] = '\0'; call_SMSfunc_set(pRecvData->pStrData, num, NULL); u8Ret = TRUE; } printf_func_line(); return u8Ret; }

プロトタイプ:
int tty_read(int fd, char *buf, int buf_max_size);
朝、この受信関数をテストしていたところ、ずっとエラーがあったが、問題がどこにあるか見つからなかった.
呼び出すと、何かわけのわからない問題が発生します.
後で調べてみると、sGsmRecvDataの原型は、中の前にpRecvData->s 32 PStrDataSzieがpRecvData->u 8 PStrDataSizeで、
関数ポインタが指すプロトタイプはint tty_read(int fd, char *buf, int buf_max_size);
このため、元の修正を
 num = pRecvData->recv(pRecvData->s32Fd, pRecvData->pStrData, (int)pRecvData->u8PStrDataSize);
このような結果が発見されたのは、依然として悪いことです.
結果は出ず、
後で本当に他の修正できるものが見つからず、
元の構造体のucharをintに変更u 8 PStrDataSizeをs 32 PStrDataSzieに変更するには、
再実行中、プログラムが正常に動作していることがわかりました.
直接関数を呼び出す場合、強制タイプ変換を使用するのは、あまり提唱されていませんが、必要に応じて使用する場合がありますが、なぜこの関数ポインタを使用する場合、このような強制変換がプログラムの実行エラーを引き起こすのか.
いくつかの要因を考慮すると
ここでの関数ポインタと、関数ポインタのパラメータは、同じ構造から来ており、強制変換時にucharからintに変換してエラーが発生する可能性があります.
もちろんこれはテストが必要です.
後でテストしてみましたが、
さっきの推測には確かに何の道理もないことに気づいた.
実際にはu 8 PStrDataSizeに1024(すなわちuchar型に1024を付与し、1024を付与すると必ず超えなければならない)を付与し、それ自体の範囲を超え、使用時にデータを失い、下位の0しか残っていない.
データの読み取りをもたらした場合、バッファサイズは0で、これが以前のエラーをもたらしたはずです.強制変換のせいではなく、データ型の死を無視している.
変換ではなく、エラーが開始されます.
しかしread関数では、バッファサイズがゼロの場合、どのように処理されますか?
テストの結果、バッファサイズがゼロの場合、
影響はなく、読み返す大きさは0です.
しかし、なぜプログラムの実行に影響するのでしょうか.