Comments 3
Плюсуюсь. Продукт качественный, многие вещи качественно вылавливает. Поздновато только статью выкладываете. Можно даже лучше заголовок сделать "PVS-Studio - 2023 - все бегут, а мы работаем над вашим кодом до последней ошибки!" Тренды, мнения и желания...
Извиняюсь за оффтоп. Пример кода:
int Letter(unsigned char ch) {
if (isalnum(ch) == 1 || isalnum(ch) == 2) return 1;
if (ch >= 192 && ch <= 255) return 1;
return 0;
}
warning: V560 A part of conditional expression is always true: ch <= 255. The value range of unsigned char type: [0, 255].
Отлично, один варнинг есть. Но есть ещё претензии к коду, который можно отловить автоматически:
повторный вызов
isalnum
в этом же выражении - микрооптимизация: вынести вызов перед сравнениемisalnum
возвращает 0 или НЕ ноль, то есть сравнение== 2
(и== 1
) некорректно. Правильно== 0
или!= 0
Незамеченное UB?
Спасибо за отличный пример! Выписали его себе для доработок нашего анализатора:
Повторный вызов
isalnum
могла бы найти V810, но на текущий момент она ограничена специфичным паттерном. Настало время расширить её.Действительно, сравнения некорректны, однако это не UB. UB будет тогда, когда передаваемый символ не представим типом
unsigned char
или это неEOF
. У нас есть похожее диагностическое правило V698 для функцийmemcmp
,strcmp
. Подумаем или над его расширением, или над отдельным правилом для семейства функций из <cctype>.
PVS-Studio и тренды 2023 года. Что волнует наших клиентов?