Как стать автором
Обновить
30
0
Филипп Хандельянц @khandeliants

Тимлид C и C++ анализатора в PVS-Studio

Отправить сообщение

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

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

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

Рекомендую не обходить стороной YouTube. Там всегда найдется что-то интересное. Например, доклады с конференций, подкасты, обучающие видео. Мой личный список интересных каналов:

Еще из мыслей – раз статический и динамический упомянули, то не забываем и про unit-тестирование :) Библиотек для этого – вагон и маленькая тележка, но лично приходилось пользоваться этим:

Судя по этой задаче, IWYU поддерживает предкомпилированные заголовки. Предлагают использовать следующие флаги:
  • --pch_in_code сообщает IWYU рассматривать первое включение как предкомпилированный заголовок. Используйте --pch_in_code, чтобы предотвратить ситуации, в которых IWYU удалит необходимые PCH включения.
  • --prefix_header_includes=<value> позволяет выбрать, что делать с включениями и опережающими объявлениями, которые встречаются как в префиксном/предкомпилированном заголовке, так и единице трансляции. Возможные значения: add (по умолчанию), keep, remove.


Также соглашусь с gasizdat, после рефакторинга у вас могут остаться куча неиспользуемых include'ов даже в предкомпилированном заголовке, а в него не стоит запихивать все и побольше.
Дополнительно уточню, что в случае опережающего объявления вы можете не только возвращать объект по значению, но даже и принимать объект по значению в качестве параметра! Единственное, что от вас требует компилятор — предоставить определение класса на момент вызова функции. Этот пример тоже скомпилируется:
// Foo.h
class Foo { .... };

// Bar.h
class Foo;                    // <= Все также опережающее объявление
class Bar
{
  Foo get_foo(Foo obj) const; // <= И принимаем параметр по значению,
                              //    и также возвращаем
  ....
};

Информация

В рейтинге
Не участвует
Откуда
Тула, Тульская обл., Россия
Работает в
Дата рождения
Зарегистрирован
Активность