LINUX.ORG.RU

cppcheck 2.6

 , , ,


0

1

Вышла новая версия cppcheck — статического анализатора исходного кода для языков C и C++.

В этом выпуске представлены новые проверки:

  • пропущенный return в функции;
  • запись перекрывающихся (overlapping) данных, обнаружение UB;
  • сравнение с значением вне допустимого диапазона типов;
  • отключение copy elision из-за использования return std::move(local);
  • открытие файла на чтение и запись в разных потоках (streams).

Также внесены улучшения:

  • Добавлен цветной вывод диагностических сообщений на Unix-based платформах.
  • Добавлен символьный анализ для ValueFlow.
  • Правила, использующие список токенов «define», могут быть сопоставлены и с #include.
  • Библиотечный тег function может использовать тег container, что позволяет задать yields или specify для контейнера, принимаемого входным аргументом свободной функции (например, std::size, std::empty, std::begin, std::end, и т.д).
  • Библиотечный тег smart-pointer может задавать тег unique для умных указателей, реализующих единоличное владение. Реализовано предупреждение о провисших ссылках на такие указатели.
  • Исправлены проблемы при использовании флага --cppcheck-build-dir.
  • htmlreport теперь может выводить информацию об авторе (получаемую с помощью git blame).
  • Больше предупреждений о не-константных переменных, которые можно сделать константными.

Помимо этого, была завершена проверка соответствия исходного кода стандарту MISRA C 2012: реализованы все правила MISRA C 2012, кроме 1.1, 1.2 (должны обеспечиваться компилятором) и 17.3 (может обеспечиваться компилятором), включая правила в поправках 1 и 2.

Исходный код анализатора распространяется по лицензии GPLv3.

>>> Подробности

★★★★★

Проверено: hobbit ()
Последнее исправление: sudopacman (всего исправлений: 12)
Ответ на: комментарий от ox55ff

https://imgur.com/a/TDYCWTC

Ага. Благодарю!

Ну, если это не нравится, то можно убрать варнинг, отключив `useStlAlgorithm` в параметрах cppcheck-а.
Или можно прямо в коде перед той строкой вписать:

// cppcheck-suppress useStlAlgorithm

Но вообще-то...
Совет cppcheck-а не бесполезен.
Он заставляет задуматься о будущих оптимизациях.

Возьмём пример:

std::vector<int> lor( const std::vector<int> & v )
{
   std::vector<int> result;

   for (auto item : v)
   {
      result.push_back( item / 2 );
   }

   return result;
}
В этом варианте не так очевидно, но его можно оптимизировать.

Сначала, как предложил `cppcheck`, перепишем его в std::transform:

std::vector<int> lor( const std::vector<int> & v )
{
   std::vector<int> result;

   std::transform(
       v.begin(),
       v.end(),
       std::back_inserter(result),
       [](int x){return x/2;} );

   return result;
}
А вот уже в этом варианте std::back_inserter как-то мозолит глаза. Можно ли обойтись без него?

Можно:

std::vector<int> lor( const std::vector<int> & v )
{
   std::vector<int> result( v.size() );  // <--

   std::transform(
       v.begin(),
       v.end(),
       result.begin(),                   // <--
       [](int x){return x/2;} );

   return result;
}

Это мелкое изменение избавило нас от перевыделения памяти, и сделало код быстрее.

Но и это ещё не всё!

Теперь можно заметить, что элементы друг от друга не зависят.
А значит их можно вычислять параллельно, добавив ещё одну строку:

std::vector<int> lor( const std::vector<int> & v )
{
   std::vector<int> result( v.size() );

   std::transform(
       std::execution::par_unseq,        // <--
       v.begin(),
       v.end(),
       result.begin(),
       [](int x){return x/2;} );

   return result;
}

Такой код современные компиляторы полностью инлайнят.
Это позволяет им использовать всякие MMX/SSE/AVX/etc для параллельных вычислений.
Из внешних вызовов остаётся только new и memset.

А при обычных циклах об этих оптимизациях даже не задумываешься.

anonymous
()
Ответ на: комментарий от Andrey_Karpov_2020

Пулл-реквесты бы лучше оформляли, чем вести спамоблоги с рекламой. Из-за передоза рекламы уважающие свое время люди, которые не любят тратить свое время на рекламу, ненавидят PVS. Главным образом потому, что реклама тут маскируется под приличные статьи и пробивается через фильтры. Cppcheck интересно обсуждать, потому что он открытый и бесплатный, у него нет миллиона вариантов лицензирования, нет фонтана пиара. Ей-богу, вместо рекламоблогов писали бы пулреквесты в открытые проекты, закрывали бы критические баги, деньги бы получали с каких-нибудь bug bounty - уважаемые были бы люди, и к PVS, как к вашей разработке, был бы интерес. Еще бы с офсайта убрать свистелки, счетчики, анимации и плашку про куки (вообще не используйте куки и тогда вроде таких ужасных плашек не надо). Чтобы сайт выглядел не как одна большая реклама, которую хочется закрыть, а как приложение для телефона или там статья какая. Цены тоже хотя бы примерные указать, обычную кнопку покупки, чтобы можно было в пару кликов купить, а не ждать неделю, пока пришлют цены и пока происходит человеческий диалог о покупке (вместо пары кликов на сайте!)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.