初始化sscanf返回的unsigned int

时间:2013-11-06 12:02:29

标签: c scanf

变量(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;
}

代码使用尚未初始化的变量,导致不可预测或意外的结果。

误报?

2 个答案:

答案 0 :(得分:0)

您收到此警告的原因是因为sscanf可能会失败(至少编译器认为如此),在这种情况下a在几行之后基于它返回值时将保持未初始化状态

答案 1 :(得分:0)

如果您收到警告,可能是编译器看到2条路径

ret = sscanf( str, "0x%x", &a );
ret = sscanf( str, "%u %u %u %u", &a, &r, &g, &b );

第一条路径未初始化r g b 稍后,代码使用r g b并且不“知道”sscanf()和您的if()如何结合以防止无意中使用未初始化的变量。

根据@Juraj Blaho的建议,将a,r,g,b初始化为0没有性能下降。您正在调用sscanf()会占用大量CPU 这是一个“误报”,但我建议您更改代码以防止出现任何警告。


次要想法:

移植问题:由于unsigned int仅确定至少为2个字节,因此(a & 0xff) << 24应为(a & 0xffUL) << 24。同样地(r & 0xffUL) << 16 )和返回类型unsigned long parse_colour() 或者,有uint32等类型

不确定是否需要if( strlen( str ) == 1 ) return (unsigned int)atoi( str );。看不出这会影响到什么。