【问题标题】:CPPCheck printing invalid characters in outputCPPCheck 在输出中打印无效字符
【发布时间】: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:您对消息的琐碎性质是正确的,因为我们已经有了行号,但是我在代码中进一步使用了错误消息,并且由于无效字符而给我错误。跨度>

标签: c++ cppcheck


【解决方案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.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
相关资源
最近更新 更多