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

C++ 针对普通字符的PC lint/Flexelint规则,c++,c,static-analysis,pc-lint,C++,C,Static Analysis,Pc Lint,Gimpel软件的PC lint和Flexelint有一条规则“971:在没有“已签名”或“未签名”的情况下使用“char”,该规则禁止在没有指定签名的情况下使用普通char类型 我认为这是误导。如果char被用作整数类型,那么显式指定有符号性可能是有意义的,但当它用于文本字符时就没有意义了。标准库函数,如printf将指针指向纯char,使用signed或unsigned char是一种类型不匹配。当然,可以在两种类型之间进行转换,但这可能会导致lint试图防止的那种错误 这个针对普通cha

Gimpel软件的PC lint和Flexelint有一条规则“971:在没有“已签名”或“未签名”的情况下使用“char”,该规则禁止在没有指定签名的情况下使用普通
char
类型

我认为这是误导。如果
char
被用作整数类型,那么显式指定有符号性可能是有意义的,但当它用于文本字符时就没有意义了。标准库函数,如
printf
将指针指向纯
char
,使用
signed
unsigned char
是一种类型不匹配。当然,可以在两种类型之间进行转换,但这可能会导致lint试图防止的那种错误


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

我认为他们选择强制您选择
signed
unsigned
的原因是因为C标准没有。C标准说明
char
unsigned char
signed char
是三种独特的类型

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


因此,我想说不,针对这一点的规则没有错,它只是试图收紧C规范。

我认为他们之所以选择强制您选择有符号的或无符号的,是因为C标准没有。C标准说明
char
unsigned char
signed char
是三种独特的类型

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


因此,我想说不,反对它的规则没有错,它只是试图收紧C规范。

PC Lint在900-999(和1900-1999 C++)范围内提供的消息称为“可选注释”,默认情况下关闭。如果您有某种特定方式的限制性编码准则,则可以使用它们。然后,您可以激活这些注释中的一个或多个,以帮助您发现潜在的违规行为。我不认为有人在真正的开发工作中激活了所有9xx消息

关于
char
,您是对的:它是一个字节(几乎总是)用于实际字符。然而,
char
被C编译器视为有符号或无符号。对于C++,<代码> char < /> >与代码>未签名char < /代码>和<代码>签名char < /c> > < /p>不同。
我曾在许多嵌入式C环境中工作过,通常有一条编码规则,规定不允许使用普通的
char
。此时应激活此PC Lint消息。例外情况,如与其他库接口时,必须明确允许,然后使用Lint注释来抑制单个消息。

PC Lint在900-999(和1900-1999用于C++)范围内提供的消息称为“可选注释”,默认情况下关闭。如果您有某种特定方式的限制性编码准则,则可以使用它们。然后,您可以激活这些注释中的一个或多个,以帮助您发现潜在的违规行为。我不认为有人在真正的开发工作中激活了所有9xx消息

关于
char
,您是对的:它是一个字节(几乎总是)用于实际字符。然而,
char
被C编译器视为有符号或无符号。对于C++,<代码> char < /> >与代码>未签名char < /代码>和<代码>签名char < /c> > < /p>不同。
我曾在许多嵌入式C环境中工作过,通常有一条编码规则,规定不允许使用普通的
char
。此时应激活此PC Lint消息。异常,如与其他库接口时,必须明确允许,然后使用Lint注释来抑制单个消息。

问题是字符串文本是普通的
char
,因此这将在gcc中生成警告:
unsigned char*mystr=“foo”问题是字符串文本是纯
char
,因此这将在gcc中生成警告:
unsigned char*mystr=“foo”