Pull to refresh

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?

Спасибо за отличный пример! Выписали его себе для доработок нашего анализатора:

  1. Повторный вызов isalnum могла бы найти V810, но на текущий момент она ограничена специфичным паттерном. Настало время расширить её.

  2. Действительно, сравнения некорректны, однако это не UB. UB будет тогда, когда передаваемый символ не представим типом unsigned char или это не EOF. У нас есть похожее диагностическое правило V698 для функций memcmp , strcmp. Подумаем или над его расширением, или над отдельным правилом для семейства функций из <cctype>.

Sign up to leave a comment.