CPPCheck 在输出中打印无效字符
Posted
技术标签:
【中文标题】CPPCheck 在输出中打印无效字符【英文标题】:CPPCheck printing invalid characters in output 【发布时间】:2018-04-23 07:09:21 【问题描述】:我正在对以下代码运行 cppcheck
bool bsIsBigEndian( void )
return (((const int*)"\0\x1\x2\x3\x4\x5\x6\x7")[0] & 255) != 0;
使用下面的命令
cppcheck --template=file;line;severity;message;id --enable=style,performance,portability file.cpp
输出
打印在
我已经尝试过 --platform 选项,但结果仍然相同。 我怎样才能摆脱无效字符?
【问题讨论】:
cppcheck 是一个旧工具,它在很多事情上都失败了 - 跳过那些错误或警告 我不明白你从 cppcheck 得到什么样的输出。您应该得到一个定义明确的输出,其中包含与检查相关的统计信息。你能发布完整的输出吗? 好像是[test.cpp:3]: (style) Condition '(((const int*)"")[0]&255)!=0' is always false
。似乎是一个 cppcheck 错误,但不会使错误消息无法使用。我的意思是,它打印了不可打印的字符,但这并不重要,因为它还提供了行号之类的上下文。
@RannLifshitz:添加了输出图像
@xfix:您对消息的琐碎性质是正确的,因为我们已经有了行号,但是我在代码中进一步使用了错误消息,并且由于无效字符而给我错误。跨度>
【参考方案1】:
你的代码有undefined behaviour。
您正在将const char *
转换为const int *
,这可能(并且将会,因为它是一个字符串常量并且编译器可能不会费心对齐它)具有不同的对齐方式。您的代码可以这样修复。
bool bsIsBigEndian()
const char *text = "\0\x1\x2\x3\x4\x5\x6\x7";
int value;
std::memcpy(&value, text, sizeof value);
return (value & 255) != 0;
memcpy
忽略对齐问题,这是正确的,只要 int
长度为 8 字节或更小,在大多数平台上为 4 字节长。
也可以改写const char text[] = 0, 1, 2, 3, 4, 5, 6, 7;
来去掉字符串常量。
【讨论】:
我在上面的代码上运行 cppcheck 时遇到问题。所以代码可能不正确。我比较担心cppcheck的输出 @pranayjain 我的意思是,这是 cppcheck 中的一个错误。 Report the issue to its developer.以上是关于CPPCheck 在输出中打印无效字符的主要内容,如果未能解决你的问题,请参考以下文章