LINUX.ORG.RU

clang. Насколько я знаю, ничего лучше из FOSS нет.

Relan ★★★★★
()

man gcc man c++

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

Это был ответ на 'Еще есть PVS-Studio. но она под винду.'

ioan
() автор топика

Лучше coverity ничего нет, все остальные просто игрушки бесполезные.

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

Звони в отдел продаж Coverity и договаривайся о времени визита их представителя. Они тебе все поставят, погоняют на твоей кодовой базе, и только потом уже назовут цену.

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

Такую фигню как раз вообще элементарно самому сделать поверх libclang.

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

вот ты Д...Л тебе сказали man gcc

root@host:~# cat unused.cpp

class TEST
{
public:
        int i;
        TEST() {}
        ~TEST() {}
};

int main()
{
        TEST t;
        return 0;
}
root@host:~# c++ -Weffc++ unused.cpp
unused.cpp: In constructor ‘TEST::TEST()’:
unused.cpp:6:2: warning: ‘TEST::i’ should be initialized in the member initialization list [-Weffc++]
anonymous
()
Ответ на: комментарий от anonymous

у gcc нет статического анализатора покрытия кода. марш учить уроки, мамка по жопе даст!

ioan
() автор топика

Не уверен, что ты прочёл в первый раз, поэтому сочту нужным повторить: cppcheck.

Deleted
()

Ещё есть fortify, не знаю пускается ли оно под онтопик, я только его отчёты видел, но он детектает даже вещи аля dns spoofing, buffer overrun, и т.д.

Стоит думаю как самолёт PVS studio.

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

unused.cpp:6:2: warning: ‘TEST::i’ should be initialized in the member initialization list [-Weffc++]

А вот если добавить i в список инициализации, то предупреждения не будет. При этом использования мембера все так же нет:

$ cat t.cpp
class TEST
{
public:
    int i;
    TEST() : i(0) {}
    ~TEST() {}
};

int main()
{
    TEST t;
    return 0;
}

$ c++ -Weffc++ t.cpp
andreyu ★★★★★
()
Ответ на: комментарий от i-rinat

А если перенести поле i в private, где ему и место, у clang срабатывает Wunused-private-field.

Если посмотреть внимательно, то:
- код не мой.
- речь шла о gcc.
- место там i или нет, решать не мне и не вам.

andreyu ★★★★★
()
Ответ на: комментарий от ioan

Насчет неиспользуемых методов - используй clang с lto, и напиши простенький llvm pass для привязки всех неиспользуемых функций к строкам кода из debug-метаданных. Определить неиспользуемые элементарно, у них будет нулевой счетчик ссылок.

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

код не мой

я в курсе

речь шла о gcc

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

место там i или нет, решать не мне и не вам

Вот как раз нам тут и решать. Мы вообще-то игрушечный пример разбираем, а не реальную кодовую базу. Что хотим, то и делаем.

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

я уже думал над этим, но это прийдётся времени потратить чтоб разобраться с lto. ничего готового нет?

ioan
() автор топика
Ответ на: комментарий от i-rinat

Если у дефолтного clang'а в такой ситуации диагностика лучше, почему бы не использовать его?

Так я и использую. Лучше из доступного под разные платформы и нет. Тот же cppcheck - вообще пародия на статический анализатор.

Вот как раз нам тут и решать. Мы вообще-то игрушечный пример разбираем, а не реальную кодовую базу. Что хотим, то и делаем.

Ну так раз нет постановки задачи, а код валиден с точки зрения языка, то почему мы можем указывать на якобы на неправильное место i? ;)

andreyu ★★★★★
()
Ответ на: комментарий от ioan

но это прийдётся времени потратить чтоб разобраться с lto

Чего там разбираться? Опцию -flto используй, и для линкера --plugin=путь-к-LLVMgold.so и -Wl,-plugin-opt=also-emit-llvm

Ну а потом с полученным LLVM IR делай все, что захочешь.

На фига тебе готовое, когда есть такой мощный инструмент? На все потребности готовых решений не напасешься, каждому чего-то особенного хочется.

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

Максим, гуглицо же на раз http://www.scmagazine.com/fortify-software-source-code-analysis/review/1083/

«The pricing for Source Code Analysis Suite is $1,200 per developer.» (с) Че тут «разглашать»? (В заголовке правда $600, но это было в году 2007-м щас оно вряд ли подешевело в крайних версиях, когда их купило HP) Но так-то да, «Дыня Карнеги» одобряет: геть зе фактс http://www.cs.cmu.edu/~aldrich/courses/654-sp07/tools/dsouza-fortify-07.pdf :) Тем же 2007-м годом... С тех пор «они продались!» И успешно.

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от slackwarrior

А блин, не признал:) Да чет я когда услышал про эту штуку, первый раз - не смог нагуглить.

Вот ща про дыню тоже не нагуглил чет, а слышать тоже не слышал:)

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

есть пару вопросов: 1) зачем голд плагин, если могу свой пасс после сборки запустить через opt? 2) где у Function счётчик ссылок? накатал уже пасс, но пока кроме как обходить все инструкции и смотреть куда идут прыжки решения не придумал

ioan
() автор топика
Ответ на: комментарий от ioan

LTO плагин соберет тебе все модули в один, и тебе не придется самому разбираться, что с чем линкуется.

Счетчик ссылок - getUsers() или типа того, метод у llvm::Value.

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

нашел, не users а uses )) сенкс за помощь, всё получилось, clang+llvm канеш мощный инструмент. единственный момент - оно всё собрало и так в один модуль, lto плагин я не указывал нигде.

ioan
() автор топика
Ответ на: комментарий от ioan

Путь к плагину надо указывать, если он где-то в нестандартном месте. Иначе clang и сам допрет, что ld передать.

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

Для множества мелких задач: построение графов зависимостей, поиск кода с определенной семантикой, инструментирование кода (для этой цели у меня есть и libc++ собранная статически с -flto), некоторые специфичные для проекта оптимизации (подстановка констант времени когфигурации с последующим ADCE).

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