Как стать автором
Поиск
Написать публикацию
Обновить

PVS-Studio и тренды 2023 года. Что волнует наших клиентов?

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров1.4K
Всего голосов 13: ↑12 и ↓1+13
Комментарии3

Комментарии 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>.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий