0

変数 (a、r、g、b) には、以前の計算から残された任意の値が含まれます。

unsigned int parse_colour( const char *str )
{
    unsigned int a, r, g, b;
    int ret;

    if( !str || !*str ) return 0;

    if( strlen( str ) == 1 ) return (unsigned int)atoi( str );

    if( str[0] == '0' && str[1] == 'x' ) {
            ret = sscanf( str, "0x%x", &a );
    } else {
            ret = sscanf( str, "%u %u %u %u", &a, &r, &g, &b );
    }

    if( ret == 1 ) {
            return a;
    } else if( ret == 2 ) {
            return 0xff000000 | ( (a & 0xff) << 8 ) | (r & 0xff);
    } else if( ret == 3 ) {
            return 0xff000000 | ( (a & 0xff) << 16 ) | ( (r & 0xff) << 8 ) | ( g & 0xff);
    } else if( ret == 4 ) {
            return ( (a & 0xff) << 24 ) | ( (r & 0xff) << 16 ) | ( ( g & 0xff) << 8 ) | (b & 0xff);
    }

    return 0;
}

コードで初期化されていない変数が使用されているため、予測不能または意図しない結果が発生します。

偽陽性?

4

2 に答える 2

0

この警告が表示される理由は、sscanf失敗する可能性があるためです (少なくともコンパイラーはそう考えています)。この場合a、数行後に値に基づいて値を返すと、初期化されないままになります。

于 2013-11-06T12:05:49.033 に答える