2017-08-04 133 views
1

我使用Coverity来静态分析我们的一些C++项目的源代码。我意识到这可能看起来像一个可笑的简单问题,但我想如果Coverity有这样的问题,我想知道这个错误被标记的根本原因。它一直在标记一个错误,我想知道这个错误是否真的改变了我的编码习惯,或者它真的是不必要的。Coverity静态分析说无符号的Int是Char(C++)

误差它标志的一个例子是:

unsigned int a; 
a = 5; 

Coverity的有一些问题与此并说:

“CID 101436(#1 1):隐式整数变换(MISRA_CAST) integer_signedness_changing_conversion:MISRA-2004规则10.1违规:隐式地改变表达式的签名。将具有基本类型char(8位,带符号)的5转换为具有不同符号类型的unsigned int(32位,无符号)。

不会有任何现代编译器知道在上面的例子中,5是一个unsigned int而不是char?这真的是一个有效的错误,它可以导致编译错误吗? 错误将尽快增加我走:

unsigned int a; 
a = 5U; 

是不是真的,如果我不每次无符号整型后指定“U”的问题吗?

+2

不,这显然不是问题。你为什么跟着MISRA开始? –

+1

错误是对是错。 “5”是一个整数,因为它是最小的整数字面量,这是错误的。虽然'5'可以用来初始化'char',因为它已知在'char'的有效范围内。 – NathanOliver

+0

如果您希望有关签名类型的警告消失,请附加“U”或修改Coverity中的跳棋(禁用检查器)。 –

回答

2

根据定义,不带后缀的数字积分常数是有符号数。您将需要投下常数或追加'U'后缀。

另一个问题是常量被指定为包含该值的最小类型。例如,5适合于int8_tsigned char。但是,260对于signed char来说太大了,所以它的最小类型是int

签名问题解决后,第二个警告可能会消失。

+0

所以如果没有U后缀,编译器会将5解释为char?它必须知道它被分配给一个无符号整数的权利,并自动解析为该类型的权利?我只是想知道为什么这个MISRA规则存在,如果现代编译器显然没有这种事情的问题。 – 9Breaker

+1

您需要获得MISRA C-2004的副本并查阅“6.10.4基本类型”部分。太多的文字要粘贴在答案中。 –

+1

你可以通过在网上搜索“stackoverflow MISRA C”找到一些相关的问题, –