变量(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;
}
代码使用尚未初始化的变量,导致不可预测或意外的结果。
误报?
答案 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 );
。看不出这会影响到什么。