【发布时间】:2021-05-22 15:36:39
【问题描述】:
我们最近发现了一行代码,相当于
bool should_escape_control_char(char ch) {
return (ch < 0x20); // control chars are 0x00 through 0x1F
}
这工作如果普通char 未签名;但是如果签名了普通的char,那么这个过滤器也会意外地捕获负字符。 (最终效果是,一个朴素的 JSON 编码器将 "é" 编码为 "\u00c3\u00a9",因为对于编码器来说,它看起来像一对负字符,然后单独编码。)
IMO,这里的原罪是我们将一个普通的char 表达式与一个整数进行比较,结果取决于char 的符号。我希望编译器告诉我们:
fantasy-warning: this comparison's result may depend on the signedness of plain char
return (ch < 0x20); // control chars are 0x00 through 0x1F
^~~~~~~~~
fantasy-note: cast the operand to silence this diagnostic
return (ch < 0x20); // control chars are 0x00 through 0x1F
~~
(signed char)(ch)
我惊讶地发现 Clang 在这种情况下没有提供警告选项;而且我在 GCC 中也没有看到任何警告选项。
- 我只是没找对地方吗?
- 存在哪些工具/linter/静态分析器在这种情况下会发出警告?
【问题讨论】:
-
如果有针对这种情况的编译器警告,我相信它会发出比您对完全合法代码所能想象的更多的警告。这是一个直接的编码错误。
标签: c++ c char static-analysis tool-rec