【发布时间】:2018-05-16 13:22:33
【问题描述】:
此代码在带有 return 的行产生中等警告:
// Checks if the symbol defines two-symbols Unicode sequence
bool doubleSymbol(const char c) {
static const char TWO_SYMBOLS_MASK = 0b110;
return (c >> 5) == TWO_SYMBOLS_MASK;
}
// Checks if the symbol defines three-symbols Unicode sequence
bool tripleSymbol(const char c) {
static const char THREE_SYMBOLS_MASK = 0b1110;
return (c >> 4) == THREE_SYMBOLS_MASK;
}
// Checks if the symbol defines four-symbols Unicode sequence
bool quadrupleSymbol(const char c) {
static const char FOUR_SYMBOLS_MASK = 0b11110;
return (c >> 3) == FOUR_SYMBOLS_MASK;
}
PVS 表示表达式总是错误的 (V547),但实际上不是:char 可能是读取到 std::string 的 Unicode 符号的一部分!
以下是符号的 Unicode 表示:1 byte - 0xxx'xxxx - 7 bits2 bytes - 110x'xxxx 10xx'xxxx - 11 bits3 bytes - 1110'xxxx 10xx'xxxx 10xx'xxxx - 16 bits4 bytes - 1111'0xxx 10xx'xxxx 10xx'xxxx 10xx'xxxx - 21 bits
以下代码计算 Unicode 文本中的符号数:
size_t symbolCount = 0;
std::string s;
while (getline(std::cin, s)) {
for (size_t i = 0; i < s.size(); ++i) {
const char c = s[i];
++symbolCount;
if (doubleSymbol(c)) {
i += 1;
} else if (tripleSymbol(c)) {
i += 2;
} else if (quadrupleSymbol(c)) {
i += 3;
}
}
}
std::cout << symbolCount << "\n";
对于Hello! 输入,输出是6,对于Привет, мир!,输出是12——没错!
我错了还是 PVS 不知道什么? ;)
【问题讨论】:
-
这可能是
signedunsigned char转换问题。 -
@user0042 所以我不明白。如果有问题,为什么它会起作用?..
-
这是一个潜在的问题。您的
char是签名还是未签名,因为移位运算符会给出不同的结果。 PVS 是否知道char是否已签名? -
'static const char TWO_SYMBOLS_MASK = 0b110;'怎么样不是彻头彻尾的错误?您指定常量为八进制(前导 0,后跟 x 或 X),然后使用十六进制数字。
-
@SornelHaetir,这是一个二进制文字,而不是八进制。
标签: c++ unicode windows-10 visual-studio-2017 pvs-studio