5

uint8_t *引数を取る関数があります:

uint8_t* ihex_decode(uint8_t *in, size_t len, uint8_t *out)
{
    uint8_t i, hn, ln;

    for (i = 0; i < len; i+=2) {
        hn = in[i] > '9' ? (in[i]|32) - 'a' + 10 : in[i] - '0';
        ln = in[i+1] > '9' ? (in[i+1]|32) - 'a' + 10 : in[i+1] - '0';

        out[i/2] = (hn << 4 ) | ln;
    }

    return out;
}

私はこの関数を次のように使用します:

uint8_t data[SPM_PAGESIZE]; // SPM_PAGESIZE = 256 bytes
uint8_t sysex_data[SPM_PAGESIZE/2];
ihex_decode(data, strlen(data), sysex_data);

しかしこの場合、私のコンパイラ(avr-gcc)は警告を返します:

main.c | 89 |警告:「strlen」の引数1を渡す際のポインタターゲットは、符号が異なります/usr/include/string.h|399|注:「constchar *」が必要ですが、引数のタイプは「uint8_t*」です。

だから、私はデータ変数を型キャストすることによって解決策を見つけました:

ihex_decode(data, strlen((const char *)data), sysex_data);

警告は消えますが、この解決策は安全かどうか疑問に思います。

もっと良い方法はありますか?

ありがとう

4

4 に答える 4

5

安全。エラーは、8ビットの符号なし整数と文字の混合に関係しています。文字は、。だけを使用すると符号付きになりますchar

ただし、関数uint8_tcharacter算術を受け入れて実行するため、chars(またはconst char問題についてはs)を受け入れる必要があります。文字定数'c'は型charであり、内部の式で符号付きと符号なしを混在させてihex_decodeいるため、オーバーフローや負の数が大きな正の数として扱われないように注意する必要があります。

最後のスタイルノート。変更されていないため、パラメータをin読み取る必要がありますconst uint8_t* in(または上記のように)。const char* in別のスタイルエラー(非常に悪いエラーにつながる可能性があります)は、lenとして受け入れますが、ループ変数をとしてsize_t宣言することです。文字列の長さが255バイトを超える場合はどうなりますか?iuint8_t

于 2011-08-10T10:41:17.927 に答える
1

非const*であるものはすべて、Cでconst*に安全にキャストできます。保存されます。

于 2011-08-10T10:22:21.437 に答える
1

これは安全です。署名なしから署名済みにキャストしているため、警告(私は思う)がポップアップします。

于 2011-08-10T10:25:07.207 に答える
0

その安全な、char<uint8_tの範囲。

于 2011-08-10T10:29:54.273 に答える