Релиз CLion 2021.1: глобальный анализ потоков данных, улучшения для удаленной работы, постфиксное автодополнение +8


AliExpress RU&CIS

Привет, Хабр!

В JetBrains стартовал новый релизный год: все наши десктопные продукты обновились или обновятся в самое ближайшее время. Сегодня мы хотим поговорить о CLion 2021.1 — новейшей версии нашей кроссплатформенной IDE для разработки на C и C++.

В этом обновлении много яркого и интересного:

  1. Анализатор кода

    • Глобальный анализ потоков данных

    • Интеграция Clazy

    • Новые проверки MISRA

  2. Удаленная работа

    • Проекты Makefile в удаленном режиме

    • Динамический анализ в удаленном режиме

    • Удаленный терминал

    • Инструмент для совместного редактирования кода

  3. Улучшения для различных типов проектов (CMake, Makefile, Qt)

  4. Постфиксное автодополнение для C и C++

  5. Отладчик

  6. Улучшения платформы IntelliJ и обновления плагинов

Новую версию можно скачать с нашего сайта и попробовать бесплатно в течение 30 дней. Если у вас есть активная подписка на CLion или All Products Pack, просто обновите версию на 2021.1. Напоминаем, что при покупке годовой подписки на любой продукт предоставляется резервная бессрочная лицензия.

А теперь поговорим о нововведениях и улучшениях в версии 2021.1 подробнее.

Анализатор кода

Глобальный анализ потоков данных

Анализ потоков данных — это мощный инструмент, который позволяет находить такие ошибки или потенциально проблемные места в вашем коде, которые не найдет компилятор. Ошибки висячих указателей (dangling pointer), разыменование нулевой ссылки (null dereferencing), неиспользуемый или недоступный код, бесконечные циклы и бесконечная рекурсия (это, кстати, не всегда ошибка, иногда такие вещи используются нарочно, но предупрежден — значит вооружен, как говорится) и многое другое.

Нам интересно реализовывать сложные инструменты анализа кода в наших продуктах — они помогают выявлять больше потенциальных проблем еще на стадии написания кода в редакторе. Анализ потоков данных (DFA) появился в CLion очень давно, а в 2020 году мы переписали его на Clang для увеличения производительности и точности анализа. В 2021 мы расширили и переработали анализатор, чтобы он поддерживал режим глобального анализа потоков данных. В чем разница между локальным и глобальным анализом?

  • Локальный анализ потоков данных работает в контексте тела функции и анализирует код только в нем. Такой анализ использовался в CLion до версии 2020.3 включительно.

  • Глобальный анализ потоков данных работает в контексте единицы трансляции (TU), позволяя увидеть более сложные связи и выявить больше проблем. Он появился только сейчас, в CLion 2021.1.

К примеру, некоторые висячие указатели можно выявить только в глобальном режиме:

Точно так же с разыменовыванием некоторых нулевых ссылок:

С появлением режима глобального анализа потоков данных также стали возможны новые проверки:

  • Постоянный результат функции — сообщает о функциях, возвращаемое значение которых всегда является одной и той же константой.

  • Постоянный параметр — сообщает о функциях, в которых параметр всегда является одной и той же константой.

  • Недостижимые вызовы функций — обнаруживает функции, точки вызова которых никогда не будут достигнуты.

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

Кстати, в качестве следующего улучшения анализатора кода мы планируем добавить Lifetime-проверки. Да-да, те самые из предложения Герба Саттера, и даже лучше!

Интеграция Clazy

Мы продолжаем улучшать поддержку Qt-проектов. Нет, поддержку QML из коробки пока не завезли :( Но мы добавили в наш языковой движок на базе Clang интеграцию с Clazy — анализатором для кода Qt. В редакторе CLion теперь доступны соответствующие проверки кода и быстрые исправления:

Настройки анализатора можно найти в Settings/Preferences | Editor | Inspections | C/C++ | General | Clazy. Стоит обратить внимание на параметр level — уровень важности проверок Clazy. В данный момент CLion 2021.1 поддерживает версию CLazy 1.8.

Новые проверки MISRA

CLion поддерживает все больше проверок стандартов MISRA C 2012 и MISRA C++ 2008. До поддержки всех проверок нам пока далеко, однако вот полный список тех, которые мы уже поддержали.

Мы планируем поддержать все проверки стандартов MISRA и начать работу над стандартом AUTOSAR.

Смотрите видео об улучшениях встроенного анализатора кода от нашего девелопер-адвоката Фила Нэша:

Удаленная работа

Проекты Makefile в удаленном режиме

В CLion 2021.1 появилась базовая поддержка удаленного режима разработки для проектов Makefile. Чтобы воспользоваться ей, достаточно указать удаленный тулчейн в разделе Settings/Preferences | Build, Execution, Deployment | Makefile и перезагрузить проект.

Пока что самое большое ограничение — отсутствие поддержки шагов для преконфигурации. То есть работать все будет, только если в корне вашего проекта уже есть Makefile. Есть и другие ограничения.

Динамический анализ в удаленном режиме

Мы стремимся к единообразию возможностей IDE для всех тулчейнов, моделей проектов и конфигураций, и теперь Google Sanitizers, Valgrind Memcheck и анализ покрытия кода работают в том числе с удаленными тулчейнами. Кстати, что касается анализа покрытия кода, теперь вам также доступен анализ покрытия ветвей кода (в дополнению к анализу покрытия строчек).

Таким образом, в зависимости от используемого тулчейна CLion предлагает следующие метрики:

  1. Покрытие строк кода (Line coverage) — то, что считает инструмент GCC/gcov. В частности, используя его, для строки return 0; int c; вы вполне можете получить покрытие 100%.

  2. Покрытие выражений (Statement coverage) — то, что считает инструмент LLVM/llvm-cov. Здесь делается честный подсчет покрытия по выражениям, и для примера, приведенного выше, 100% вы не получите.

  3. Покрытие ветвей кода (Branch coverage) — работает и в GCC/gcov, и в LLVM/llvm-cov с версии 12.0.0. Следует помнить, что GCC/gcov учитывает ветви, сгенерированные на этапе компиляции, а LLVM/llvm-cov — нет. Поэтому вы с трудом добьетесь от gcov покрытия 100% при наличии таких вот «?скрытых веток»?, возникающих, в частности, из-за обработки исключений.

Удаленный терминал

При работе с удаленным проектом порой возникает желание выполнить какую-то команду на удаленном хосте (в папке проекта). Разумеется, в CLion вы можете открыть ssh-сессию на удаленной машине. Однако если вы используете настройки по умолчанию, вам еще предстоит найти папку проекта (узнать путь, по которому IDE ее синхронизировала). Мы решили упростить эту процедуру. Новое действие Tools | Open Remote Host Terminal сразу переходит в папку проекта на удаленном хосте. Удаленный хост соответствует выбранному удаленному профилю, а локальный — первому удаленному профилю, найденному в проекте.

Инструмент для совместного редактирования кода

Code With Me — наш новый инструмент для совместной удаленной разработки и парного программирования. Мы про него уже писали в прошлый релиз, когда он только появился и был доступен по программе раннего доступа. Коротко об изменениях:

  1. Сервис теперь доступен официально, программа раннего доступа завершена.

  2. Соответствующий плагин включен в CLion 2021.1 по умолчанию.

  3. О том, входит ли Code with Me в вашу подписку и какие мы предлагаем коммерческие планы, можно узнать на нашем сайте.

  4. Все планы включают: аудио- и видеозвонки, поддержку совместного редактирования кода, режим полной синхронизации, умный анализ кода и многое другое.

И хотя пока не все возможности CLion доступны в режиме совместного редактирования, сервис уже умеет довольно много. Пробуйте и рассказывайте нам о своих впечатлениях!

Улучшения для различных типов проектов (CMake, Makefile, Qt)

Мы уже поговорили о поддержке проектов Makefile в режиме удаленной разработки и анализаторе Clazy для проектов на Qt. Но в CLion 2021.1 есть и другие улучшения для различных типов проектов.

CMake

Обновление включает версию CMake 3.19 (кстати, это первая версия, поддерживающая Apple Silicon — чип M1. Мы также успели поправить критическую проблему с версией CMake 3.20 — теперь ее тоже можно использовать в CLion 2021.1, но по умолчанию эта версия CMake пока не включена в поставку CLion.

Профили CMake, которые вы настраиваете через IDE, теперь можно сохранить в VCS. Для этого выберите опцию Share в разделе Settings/Preferences | Build, Execution, Deployment | CMake, после чего вы сможете закоммитить файл cmake.xml в систему контроля версий вместе с проектом. Предвосхищая вопрос из зала: поддержка CMake Presets будет, работа над ней начнется уже в ближайший релиз (CPP-22906).

Makefile

Основное обновление для проектов Makefile — начальная поддержка удаленных тулчейнов. Кроме того, мы встроили в CLion плагин Makefile Language, разработку которого наша команда также взяла на себя. Плагин обеспечивает подсветку синтаксиса make, быстрый доступ к документации, действие Find Usages для таргетов, а также различные возможности навигации и автодополнения кода для Makefile.

Qt

Помимо встроенного анализатора Clazy, разработчики Qt-проектов могут пользоваться обновленным диалогом создания нового класса — Qt UI Class:

Появилась возможность указать пространство имен и вписать произвольный класс в качестве родительского класса.

А еще мы добавили раскладку клавиатуры QtCreator.

Видео от Фила Нэша об улучшениях для различных типов проектов:

Постфиксное автодополнение для C и C++

Хотели ли вы иметь для языков C и C++ унифицированный синтаксис вызова функций (UFCS)? Теперь он вам не нужен! С новой возможностью постфиксного автодополнения кода на C и C++ вы сможете передать только что написанное выражение в свободную функцию в качестве первого аргумента. Введите выражение, поставьте точку и выберите свободную функцию из списка вариантов автодополнения:

С помощью постфиксного автодополнения также можно обернуть только что написанное выражение в одну из типичных языковых конструкций:

Среди шаблонов есть циклы, конструкции приведения типов и многое другое. Полный список вы найдете в разделе Settings/Preferences | Editor | General | Postfix Completion.

Видео от Фила Нэша с примерами того, насколько полезным может быть постфиксное автодополнение:

Отладчик

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

  • В настройках конфигурации теперь можно указать sysroot. Это поможет находить библиотечные символы при отладке дампов приложений, собранных в других системах.

  • Для LLDB теперь возможна отладка дампа памяти приложений, собранных без отладочной информации, если эта информация отдельно указана в настройках отладчика (в виде файла символов). Раньше это работало только для GDB, а теперь доступно и для пользователей LLDB.

Действие Set Execution Point теперь работает не только для кода на C/C++, но и для ассемблерного кода:

Рекомендуем использовать это действие с осторожностью. Например, важно не пропустить шаг инициализации переменных.

Улучшения платформы IntelliJ и обновления плагинов

Множество улучшений «приезжает» в CLion из платформы IntelliJ. Например, те, что связаны с системами контроля версий:

  • Возможность выбирать профиль инспекций кода, которые запускаются перед коммитом

  • Шаблоны Git-коммитов

  • Действие Save to Shelf и др.

А еще CLion очень популярен среди Rust-разработчиков. И в плагине IntelliJ Rust мы тоже добавили множество улучшений — про них мы выпустили отдельный пост в нашем англоязычном блоге. Скажем лишь коротко, что мы добавили рефакторинг Change Signature и улучшили поддержку условной компиляции, а действие Find Usages теперь доступно для функций Cargo.

Также хочется упомянуть плагин для поддержки языка Swift. Вы спросите: “Зачем это нужно в CLion, когда есть AppCode!?” Да, но AppCode доступен только для Mac, а Swift теперь работает и на Ubuntu, и на Windows. Поддержка Swift на платформе Windows — это именно то, что мы добавили. Всю работу проделали наши коллеги из продукта AppCode. А если вам интересно, как же начать программировать на Swift под Windows, читайте пост в блоге Appcode.

На этом у нас все. Если вы дочитали до конца, напишите в комментариях свое любимое сочетание клавиш в CLion, если таковое имеется.

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

Команда CLion
The Drive to Develop




Комментарии (32):

  1. ndimens
    /#22901742

    Обновил DataGrip, Idea… Зачем такие вырвиглазные заставки теперь? :((((

    • anastasiak2512
      /#22901754 / +1

      В IntelliJ IDEA и CLion сплеши на темном фоне. Сделали чуть менее контрастными как раз по просьбам пользователей. Но вообще передадим ваш фидбек команде дизайна. Спасибо!

    • avraam_linkoln
      /#22901848

      Обновил PHPStorm и RubyMine — тоже не понял зачем такие отвратительные заставки. Наверное градиенты уже не в моде

    • skymal4ik
      /#22904918

      Поддерживаю предыдущих комментаторов, стиль новых заставок тоже не нравится. Старые с градиентами смотрелись ИМО гораздо лучше.

  2. nullc0de
    /#22901902 / -1

    «Напоминаем, что при покупке годовой подписки на любой продукт предоставляется резервная бессрочная лицензия.» Ага, только забыли напомнить, что обновления на бессрочную лицензию будут доступны только внутри 2021.1 релиза, а не всего 2021 мажорного релиза. Что делает покупку IDE вначале года не выгодной т.к. содержит в себе еще кучу свежих багов. И есть еще стойкое чувство при покупке, что тебя жестко наегрели, т.к. другой весь софт дает бесплатно обновления в течении мажорного релиза, и дает все обновления бесплатно на следующий мажорный релиз если он был выпущен в течении срока подписки, поэтому пожалуй стоит отказаться от покупки. Лучшие заставки были в 2019 году, последние два года, это просто вырви глаз уродство! А еще просто блевать охота от анимации при закрытии окна, когда приложение вытягивает в один из углов рандомно. Не понятно зачем суете свою кривую анимацию при закрытии и используете ее вместо системной!

    • anastasiak2512
      /#22902090

      У нас нет понятия 2021 мажорного релиза. Мажорных релизов — 3 в год (2021.1, 2021.2, 2021.3). Минорные апдейты (со второй точкой) с баг-фиксами доступны по "вечной лицензии" на ту версию, с которой начался годовой период оплаты.

      • nullc0de
        /#22902110 / +1

        Про то и речь, что обман и все не как у нормальных компаний. Даже баги которые были отправлены вам 3 года назад в вашем софте были не поксены, и мне до сих пор приходят очень часто уведомления по ним! Не говоря про то, что некоторого важного функционала нет ни в rider ни в clion, и даже не предвидится, баги не фиксятся и приходится использовать visual studio, которая хотя бы дает возможность нормально программировать, а не ждать погоды от разработчиков Jetbrains.

        • anastasiak2512
          /#22902162

          А можете сказать конкретнее, какие именно баги особенно мешают и какой важный функционал отсутствует?

          • nullc0de
            /#22906972 / +1

            Вас что на youtrack.jetbrains.com/issues забанили за плохую работу и отключили сортировку по дате, чтобы открыть старые открытые баги? Кучу багов WSL, mingw-w64 с WSL не поддерживался, даже QT поддерживается криво, кучу ошибок сыпет по синтаксису, часть видимо пофиксили в 2021.1. Нет профилировщика GPU, графических элементов. Cамое интересное до сих пор нет в отладчике смены отображения данных для базовых типов, мне например надо не редко смотреть к пример int в бинарном формате и 16 ричном, сейчас только можно смотреть в 10чном. При этом дамп можно смотреть в 16ричном. Не возможно заниматься системным программированием и отлаживать ядро, за исключением linux. Embedded поддержка тоже не полноценная, ни xilinx ни stm32, нормально не поддерживаются, даже нет базовой подсветки синтаксиса VHDL, все плагины для поддержки VHDL кривые, нет поддержки HLS. Самое главное IDE очень медленная, когда для embedded ide на основе eclipse просто летают. Частые баги с кэшем, часто IDEs от Jetbrains взбешиваются и пытаются сделать рехэш всего проекта. К примеру IDEA каждый раз пытается индексировать openjdk… Зачем? Расширенные индексы грузятся долго, и почему-то загружаются по новой при каждой загрузке проекта! Видимо нет хэш таблиц контрольных сумм файлов?! В Rider кучу проблем с XAML, кривая поддержка графических элементов, даже просмотр не всегда работает, не говоря про отладку и профилировку их. Xcode и Visual Studio давно все это умеют и на голову полноценнее, стабильнее. Не понятно зачем покупать ради QT Clion если есть нормальная native поддержка в Qt Creator. Нет там автодополнения, ну и х с ним… Вон KDE написан без вашей чудо IDE и ничего, развиваются, никто из разработчиков не умер. Автодополнение, рефакторинг и некоторые фишечки единственные плюсы продуктов от Jetbrains. И все это рассчитано на опенсорс, на веб или околовеб. Самый стабильный продукт из всех это IDEA, который полноценное можно использовать. Остальное работает криво, и приходится изобретать костыли, на которые уходит большем времени чем экономит автодополнение. Про серьезную разработку чего-то графического или системного можно забыть…

            • anastasiak2512
              /#22909366

              Тикеты в YouTrack я, безусловно, смотрю, как и читаю весь фидбек по всем соц. каналам наших продуктов. Комментарий не очень вежливый с вашей стороны.


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


              1. "Кучу багов WSL, mingw-w64 с WSL не поддерживался" — на WSL много всяких задачек, но наверное самое критичное это определение самого WSL. Вообще вся технология довольно молодая, и MS часто и много там всего меняет прямо в основании, да и багов там тоже много. WSL и WSL2, например, совсем разные системы. Поэтому определение, к сожалению, пока не очень стабильно. Остальное из мне известного — этого какие-то штуки, которые иногда не стабильно работают в случае с WSL из-за особенностей маппинга данных или чего-то такого. Если что-то из такого особо мешает, скажите, мы посмотрим, что можно сделать. Про mingw-w64 я, к сожалению, не поняла, потому что на WSL же линуксовый тулчейн.


              2. "даже QT поддерживается криво, кучу ошибок сыпет по синтаксису, часть видимо пофиксили в 2021.1" — вообще подсчетка кода и показ ошибок через Clangd гарантирует, что корректно компилирующийся код мы подсветим без ошибок. Какая-то специфика Qt может не учитываться при автогенерации кода, но это другая история. По трекеру есть вот такая задача CPP-14377, но автор ее нам так и не ответил, а у нас не воспроизвелось. Если у вас воспроизводится проблема, пожалуйста, отпишитесь в задаче.


              3. "Нет профилировщика GPU, графических элементов." — было бы наверное и вправду интересно что-то такое добавить. Надо изучать существующие инструменты для начала, конечно. Создала реквест к нам CPP-24788.


              4. "нет в отладчике смены отображения данных для базовых типов" — вообще hex-view есть (вот тут написано, как его включать). Мы его называем "экспериментальным" только потому, что нам не очень нравится, как именно он работает. Хочется переписать и это даже есть в планах у подкоманды отладчика, но пока отвлекают более приоритетные задачи.


              5. "даже нет базовой подсветки синтаксиса VHDL" — не самый популярный запрос к нам, признаюсь често, но некоторый экспериментальный плагин у нас есть. Узнаю, что там с публичным доступом к нему.


              6. "Embedded поддержка тоже не полноценная, ни xilinx ни stm32, нормально не поддерживаются" — а что все же такое "нормальная поддержка"? Текущая поддержка описана вот тут. Она, конечно, сильно не полная — мы только недавно начали двигаться в эту сторону. Думаю, Elmot будет очень интересно послушать ваши идеи.


              7. реиндексирование — это явная проблема, ее стоит заводить в трекер.


              8. Про Rider отвечу позже, обсужу с командой.



              Не понятно зачем покупать ради QT Clion если есть нормальная native поддержка в Qt Creator.

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

            • anastasiak2512
              /#22910218

              Коллеги говорят, что превью плагина для VHDL можем выдать приватно на потестить, если интересно.

            • anastasiak2512
              /#22910222

              По поводу


              В Rider кучу проблем с XAML, кривая поддержка графических элементов, даже просмотр не всегда работает, не говоря про отладку и профилировку их.

              Мы переработали его в 211 и он не должен уступать в чем-то студийному
              Про дебаг и профилирование, если честно, проблем не знаем, подскажете о чем речь?

  3. NixGuy
    /#22901952

    У меня, после апдейта, когда закрываешь и потом открываешь ide, перестает работать навигация по коду: все модули, классы, методы, константы и т.п. становятся неизвестными для ide. Лечится инвалидацией кешей и индексов. Так что плевать как выглядит новый сплеш.

    • anastasiak2512
      /#22902094

      Интересно. А после инвалидации кешей больше не проявляется? Только один раз было?

      • NixGuy
        /#22902106

        Сегодня уже два раза такое было. Оба раза ide закрывалась системой при перезагрузке.

        • anastasiak2512
          /#22902158

          Пришлите, пожалуйста, лог файл из IDE в наш саппорт clion-support@jetbrains.com. Изучим проблему.

          • nullc0de
            /#22906980

            anastasiak2512 вы багрепоты не читаете? С подобной проблемой столкнулись так же пользователи IDEA. В соседней теме про idea, там несколько человек отписалось с этой проблемой.

            • anastasiak2512
              /#22907038

              Во-первых, проблемы в разных IDE могут оказаться не связанным, во-вторых, даже в idea сейчас идет инвестигация и они просят логи, чтобы понять, в чем проблема. Нам бы очень помогло больше данных о проблеме.

            • anastasiak2512
              /#22908590

              Нам все еще был бы полезен лог файл из IDE. У нас есть несколько связанных (кажется) проблем сейчас в трекере (IDEA-266391, IDEA-265506), но ясности там пока нет. Будем благодарны за любую информацию.

  4. BratSinot
    /#22904180

    Эх, а нормальной интеграции с Docker / WSL как не было, так и нет. В связке ssh / sftp / rsync нереально работать с разными ветками, вечно нужно какие то танцы с бубном делать чтоб файлы в контейнере поменялись.

    • anastasiak2512
      /#22905130

      Ветки, это скорее про поддержку VCS в ремоут режиме. Ее пока нет, но мы планируем ей заняться, не уверена правда про ближайший релиз.

  5. lamerok
    /#22906606

    У меня анализатор перестал понимать constexpr, пишет в подсказке, давайте создадим класс constexpr. И всё красное из за этого.
    Закладка, С++-> Clang зависла и не открывается.
    Вернулся обратно к 2020.3.3

    • anastasiak2512
      /#22906656

      А можете пример в трекер засабмитить, чтобы мы посморели? И какая ОС/тулчейн?

  6. 0xd34df00d
    /#22907522

    Спасибо за релиз!


    Правда, почему-то не работают некоторые clazy'вские quickfix'ы:


    У вас в скринкасте там прям опция для автоматического преобразования в новый синтаксис соединений вылезает, а у меня её нет. Что я мог упустить?

    • anastasiak2512
      /#22908594

      А вы level какой при этом выставили в настройках? У меня на анимации, например, не дефолтовые настройки. Level-ы конфигурируются в настройках Clazy в Inspections | C/C++

      • 0xd34df00d
        /#22909860

        Да, я там нашёл и заменил дефолтовый level0 на level2. Сама инспекция при этом появляется, старый connect выделяется (и если открыть менюшку на моём скриншоте, там как раз будет про clazy-old-style-connect), но вот квикфикса нет (хотя он при этом есть для некоторых других инспекций).

        • anastasiak2512
          /#22910214

          А это все на какой платформе и с каким тулчейном происходит, подскажете?

          • 0xd34df00d
            /#22910234

            Линукс. Тулчейн — ну, clang 11.1 от дистрибутива. Если есть какая-то кнопочка в clion, которую можно нажать, и которая даст больше полезной вам информации, подскажите, где ей найти.