Для получения триального ключа
заполните форму ниже
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Бесплатная лицензия PVS-Studio для специалистов Microsoft MVP
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Мне интересно попробовать плагин на:
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
>
Как PVS-Studio защищает от поспешных пр…

Как PVS-Studio защищает от поспешных правок кода, пример N6

20 Окт 2022

Программисты часто допускают ошибки в коде по невнимательности или из-за спешки. Если вам интересно, как можно быстро находить такие ошибки, то мы рады приветствовать вас в очередной статье из цикла "Как PVS-Studio защищает от поспешных правок кода". Сегодня мы обратили внимание на проект FreeCAD.

1001_how_to_pvs-studio_protect_N6_ru/image1.png

Сначала я хотел бы рассказать о том, как ошибка была найдена. Конечно, для постоянных читателей нашего блога это не является секретом, тем более что эта заметка далеко не первая из своей серии. Однако, возможно, это будет интересно новым читателям.

Один из наших форматов работы с open-source проектами – ежедневная автоматизированная проверка их исходного кода. При этом эта проверка настроена так, что каждый день можно смотреть срабатывания анализатора только на свежем коде. Это и значительно быстрее просмотра полного отчёта анализатора, и позволяет очень быстро обнаружить потенциальную ошибку. О том, как мы реализовали такой процесс мониторинга open-source проектов и какие технологии при этом использовали, можно подробно прочитать тут.

Теперь, посмотрим на ошибку, найденную анализатором PVS-Studio в проекте FreeCAD. Для масштаба, я постарался не сильно сокращать проблемный фрагмент кода:

TechDraw::DrawPage* DrawGuiUtil::findPage(Gui::Command* cmd, bool findAny)
{
  ....
  //check Selection for a page
  std::vector<App::DocumentObject*> selPages = cmd->getSelection().
                     getObjectsOfType(TechDraw::DrawPage::getClassTypeId());
  if (selPages.empty()) 
  {
    //no page in selection, try this document
    auto docPages = cmd->getDocument()
                  ->getObjectsOfType(TechDraw::DrawPage::getClassTypeId());
    if (docPages.empty()) 
    {
        //we are only to look in this document, and there is no ....
        QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No page found"),
                    QObject::tr("No Drawing Pages in document."));
      return nullptr;
    }
    if (docPages.size() > 1) 
    {
      //multiple pages in document, use active page if there is one
      Gui::MainWindow* w = Gui::getMainWindow();
      Gui::MDIView* mv = w->activeWindow();
      MDIViewPage* mvp = dynamic_cast<MDIViewPage*>(mv);
      if (mvp) 
      {
        QGSPage* qp = mvp->getViewProviderPage()->getQGSPage();
        return qp->getDrawPage();
      }
      else 
      {
        // none of pages in document is active, ask for help
        for (auto obj : selPages) // <=
        {
          ....
        }
        ....
      }
      ....
    }
    ....
  }
  ....
}

PVS-Studio выдал на этом коде следующее предупреждение:

V1078: An empty container is iterated. The loop will not be executed.

Итак, у нас есть контейнер selPages, который инициализируется функцией getObjectsOfType. Он может быть пустым, о чём нам говорит проверка selPages.empty(). Если условие истинно, в одном из вложенных условий происходит попытка обойти данный контейнер. Однако его размер к этому моменту не меняется.

Посмотрев на такой фрагмент кода, становится очень интересно то, каким он был до коммита. Вот ссылка на изменения.

1001_how_to_pvs-studio_protect_N6_ru/image2.png

Программист теперь не модифицирует контейнер selPages, а сохраняет результат в новую переменную docPages. Затем он переписал код, используя везде новую переменную, но забыл исправить цикл.

Таким образом, ошибка могла бы не просочиться в репозиторий при регулярном использовании статического анализа перед коммитом. Даже если вы что-то упустили во время code review, анализатор подсветит вам проблемное место.

Предыдущие публикации:

Последние статьи:

Опрос:

Популярные статьи по теме
Holy C++

Дата: 23 Ноя 2022

Автор: Гость

В этой статье постараюсь затронуть все вещи, которые можно без зазрения совести выкинуть из С++, не потеряв ничего (кроме боли), уменьшить стандарт, нагрузку на создателей компиляторов, студентов, из…
Продление жизни временных значений в С++: рецепты и подводные камни

Дата: 01 Ноя 2022

Автор: Гость

Прочитав эту статью, вы узнаете следующее: способы, которыми можно продлить время жизни временного объекта в С++; рекомендации и подводные камни этого механизма, с которыми может столкнуться С++ прог…
Как мы баг в PVS-Studio искали или 278 Гигабайтов логов

Дата: 28 Окт 2022

Автор: Григорий Семенчев, Сергей Ларин, Филипп Хандельянц

Предлагаем вашему вниманию интересную историю о поиске бага внутри анализатора PVS-Studio. Да, мы тоже допускаем ошибки, но мы готовы засучить рукава и залезть в самую глубину "кроличьей норы".
0, 1, 2, Фредди забрал Blender

Дата: 26 Окт 2022

Автор: Андрей Карпов

Эта статья могла бы получить название "Как PVS-Studio защищает от поспешных правок кода, пример N7". Однако так именовать статьи становится скучновато. Поэтому сейчас вы узнаете, причём здесь Фредди …
Примеры ошибок, которые может обнаружить PVS-Studio в коде LLVM 15.0

Дата: 25 Окт 2022

Автор: Андрей Карпов

Компиляторы развиваются и выдают всё больше предупреждений. Остаются ли преимущества от использования статических анализаторов кода, таких как PVS-Studio? Да, так как анализаторы тоже развиваются. Пе…

Комментарии (0)

Следующие комментарии
Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо