IDE для c++/linux, обнаруживающая сомнительный код

Я использую emacs как единственный программный редактор. Но в последнее время я часами бился над проблемами, которые в итоге оказались простыми ошибками с моей стороны. Например, написав if(n < n)вместо if(n < N), или объявив функцию как bool вместо double:

bool foo() {
   return 0.5;
}

Ни emacs, ни emacs не gcc -Wallсмогли обнаружить эти проблемы.

Есть ли IDE, которая может это сделать? Должно

  • работать на линуксе
  • буть свободен
  • иметь возможность показывать различные проблемы в коде, а не только синтаксические ошибки

Кроме того, я хотел бы

  • можно использовать на маленьких экранах (можно сфокусироваться на одном окне и скрыть все заголовки/меню/значки...)
  • распознавать сочетания клавиш emacs
Будет ли бонусом, если он скажет вам использовать осмысленные имена переменных? ;-)

Ответы (3)

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

Для C++ есть следующие линтеры на выбор:

Если вы еще не подключены к своему редактору, Vim имеет Syntastic для их интеграции, чтобы ваш файл автоматически проверялся при вводе или сохранении.

Некоторые из них знают, как генерировать готовый для emacs вывод.

К сожалению, в моей системе ни gcc, clang_check, ни cpplint не жаловались на ваши два теста. Даже с g++ -ansi -pedantic -Wall -Wextra -Weffc++.

Из приведенного выше списка cppcheck может быть тем, с наибольшей вероятностью поймающим ваши тестовые примеры, поскольку он является инструментом статического анализа («не компилятором», как говорится в документации).

На самом деле, это поймало ваш n<nслучай:

$ cppcheck --enable=all test.cc
[test.cc:17] -> [test.cc:17]: (style) Same expression on both sides of '<'.

Возможно, программист на C++ может объяснить, почему возврат чего-то, кроме объявленного логического значения в вашем тестовом примере, не является чем-то, о чем инструменты громко кричат.

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

Я понимаю, что вы просили IDE, но хороший редактор с плагинами и хорошей настройкой иногда неотличим от "IDE".

Я бы посоветовал вам хотя бы попробовать что-то вроде программного обеспечения для статического анализа кода, такого как c++ linter .

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

Спасибо тугли. Я также думаю, что то, что мне нужно, не обязательно должно быть ide, но вполне может быть автономным приложением, в которое я могу передать свой код (даже через Интернет), когда столкнусь с различными проблемами.
@OttToomet Некоторые из них также могут быть интегрированы с IDE. например, для затмения

Вим/Неовим?

введите описание изображения здесь


Но, прежде всего, статические анализаторы имеют свое место и плохо подходят для редактирования вашего файла. Запускайте их после внесения изменений и перед фиксацией кода, тем самым удаляя любые распространенные изящные ошибки, которые могли появиться в вашем коде. Взгляните на oclint , cppcheck , clangcheck , clang-tidy , clang-static-analyzer .


Я могу назвать множество плагинов для улучшения вашего рабочего процесса, но наиболее важным является YouCompleteMe . Видите эти красные крестики на самом левом буфере? Они будут обновляться в фоновом режиме по мере ввода и сообщать вам, где вы могли допустить ошибку.


YouCompleteMe — это быстрый механизм завершения кода с нечетким поиском для Vim. Он имеет несколько двигателей завершения:

  • механизм на основе идентификаторов, который работает со всеми языками программирования,
  • механизм на основе Clang, обеспечивающий собственное семантическое завершение кода для C/C++/Objective-C/Objective-C++ (отныне называемых «языками семейства C»),

  • механизм завершения на основе джедаев для Python,

  • механизм завершения на основе OmniSharp для C#,

  • механизм завершения на основе Gocode для Go,

  • механизм завершения на основе TSServer для TypeScript,

  • механизм завершения на основе Tern для JavaScript.

  • и многофункциональное средство завершения, использующее данные из универсальной системы Vim для обеспечения семантических дополнений для многих других языков (Ruby, PHP и т. д.).

введите описание изображения здесь