针对普通字符的PC-lint / Flexelint规则

时间:2012-09-20 17:02:26

标签: c++ c static-analysis pc-lint

Gimpel Software的PC-lint和Flexelint有一个规则“971:使用'char'而没有'signed'或'unsigned'”,禁止使用普通char类型指定签名。

http://www.gimpel.com/html/pub/msg.txt

我认为这是错误的。如果char用作整数类型,那么明确指定signedness可能是有意义的,但是当它用于文本字符时则没有意义。标准库函数(如printf)指向普通char,使用signedunsigned char是类型不匹配。当然可以在类型之间进行转换,但这可能导致lint试图阻止的那种错误。

这种针对普通char类型的lint规则是错误的吗?

2 个答案:

答案 0 :(得分:3)

PC Lint在900-999(以及1900-1999 for C ++)范围内提供的消息称为“Elective Notes”,默认情况下为off。如果您的编码指南以某种特定方式受到限制,则可以使用它们。然后,您可以激活其中一个或多个注释,以帮助您查找可能的违规行为。我认为没有人在真正的开发工作中激活了所有9xx消息。

你是对的char:对一个真正的角色使用一个字节(几乎总是)。但是,char被C编译器视为有符号或无符号。对于C ++,charunsigned charsigned char不同。

我在其中使用的许多嵌入式C环境习惯上都有一个编码规则,声明不允许使用普通char。那时应激活此PC Lint消息。必须明确允许例外,例如与其他库接口,然后使用Lint注释来抑制单个消息。

答案 1 :(得分:0)

我认为他们选择强迫您选择signedunsigned的原因是因为C标准没有。 C标准规定charunsigned charsigned char是三种唯一类型。

例如,

gcc使默认signed,但可以使用标记-funsigned-char

进行修改

所以IMO我会说不,规则是没有错,它只是试图收紧C规格。