我们最近发现了一行代码相当于
bool should_escape_control_char(char ch) {
return (ch < 0x20); // control chars are 0x00 through 0x1F
}
如果 plainchar
是 unsigned ,则此方法有效;但是如果 plainchar
被签名,那么这个过滤器也会意外地捕获负字符。(最终的效果是一个朴素的 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 中也没有看到任何警告选项。
- 我只是没有找对地方吗?
- 在这种情况下,存在哪些工具/短绒/静态分析器会发出警告?