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 回答
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()s 和 your if()s 如何组合以防止无意使用未初始化的变量。

a,r,g,b正如@Juraj Blaho 所建议的那样,初始化为 0 没有性能下降。你正在打电话sscanf()这会消耗大量的 CPU。
这是一个“误报”,但我建议您更改代码以防止出现任何警告。


小想法:

移植问题:因为 aunsigned 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 );. 看不出这对事情有什么影响。

于 2013-11-06T13:05:36.013 回答