該代碼在生產線中的警告瓦特/ return
:PVS-Studio是否瞭解Unicode字符?
// 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
可以是Unicode符號的一部分被讀取到std::string
! 下面是符號的Unicode表示:
1 byte - 0xxx'xxxx - 7 bits
2 bytes - 110x'xxxx 10xx'xxxx - 11 bits
3 bytes - 1110'xxxx 10xx'xxxx 10xx'xxxx - 16 bits
4 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知道些什麼? ;)
這可能是一個''signed'簽名char'轉換的問題。 – user0042
@ user0042所以我不明白。如果有問題,它爲什麼會起作用? – SerVB
這是一個潛在的問題。你的'char'有符號還是無符號,因爲移位運算符會給出不同的結果。並且PVS是否知道'char'是否被簽名? –