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 在输出中打印无效字符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 cppcheck 中抑制库代码的输出?

如何在 Xcode 中显示 cppcheck 输出?

cppcheck 抱怨 c_str() 的危险使用。此调用后 c_str() 返回的值无效

发布“永久”cppcheck 报告

即使标准输出中没有错误,cppcheck 也会返回错误

TeamCity 和 cppcheck 输出模板