Pull to refresh
30
0
Филипп Хандельянц @khandeliants

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

Send message

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

  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; // <= И принимаем параметр по значению,
                              //    и также возвращаем
  ....
};

Information

Rating
4,308-th
Location
Тула, Тульская обл., Россия
Works in
Date of birth
Registered
Activity