C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Теперь PVS-Studio поддерживает C++Builder  (Прочитано 8553 раз)
Andrey_Karpov
Участник
**

Сказали спасибо: +3/-1
Offline Offline

Сообщений: 14


« : 31 января 2013, 10:40:26 »

Инструмент статического анализа PVS-Studio изменил номер версии на 5.00. Почему? Потому что мы очень потрудились для этого релиза!

Прежде всего, мы разработали интеграцию PVS-Studio для Embarcadero C++Builder. Или для Embarcadero RAD Studio – мы пока сами не до конца понимаем, как правильно говорить.

Теперь пользователям C++Builder доступна вся мощь статического анализа PVS-Studio. А это, в настоящее время более 160 диагностик общего назначения. Кроме того, ведь в C++Builder XE3 Update 1 наконец-то появился 64-битный компилятор! А это значит, что более 30 диагностик миграции кода на 64-битные системы, которые давно есть в составе PVS-Studio для Visual C++, теперь актуальны и для пользователей C++Builder. Эти диагностики хорошо знакомы давним пользователям нашего анализатора еще со времен, когда он назывался Viva64. Так вот теперь этот набор правил доступен и в C++Builder.

В первом релизе PVS-Studio пятой версии поддерживаются следующие версии C++Builder: XE2, XE3, XE3 Update1 с 64-битным компилятором. В дальнейшем мы планируем поддержать еще несколько более старых версий C++Builder.

Это первый публичный релиз PVS-Studio для C++Builder, поэтому вероятно количество ошибок будет чуть выше, чем обычно у нас бывает. Мы просим простить нас за это и не стесняться писать в поддержку на support@viva64.com.

Следующим важным нововведением является поддержка Windows Phone 8 и Windows Store проектов в Visual Studio 2012. Такие проекты уже начинают появляться, и нам приятно предоставить возможность статического анализа и для них, а не только для стандартных проектов desktop-приложений. Писать про это особенно нечего, просто если у вас либо Windows Phone 8, либо Windows Store проект на C++ - запустите PVS-Studio и увидите список обнаруженных в коде проблем.

Для тех пользователей, кто не знаком с PVS-Studio, кратко перечислим основные возможности продукта. PVS-Studio это статический анализатор кода, который интегрируется в Visual C++ и C++Builder. Также поддерживается command line версия, включая MinGW-окружение. PVS-Studio содержит несколько сотен диагностический сообщений, разделенных на 4 раздела:

    Диагностика общего назначения.
    Диагностика возможных оптимизаций.
    Диагностика 64-битных ошибок (Viva64).
    Диагностика параллельных ошибок (VivaMP).

Поддерживается интеграция в следующие среды:

    Microsoft Visual Studio: 2012, 2010, 2008, 2005.
    Embarcadero RAD Studio: XE3 Update1, XE3, XE2.
    MinGW.

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

Если вам нужно просто описать для коллеги, что такое PVS-Studio, то скажите так: "PVS-Studio - это статический анализатор C/C++ кода с простой лицензионной и ценовой политикой, который легко установить и использовать без необходимости развертывания сложного окружения".

Скачать и попробовать PVS-Studio можно без всяких форм и регистраций здесь.
Записан
S0mbre
Глобальный модератор
***

Сказали спасибо: +1113/-22
Offline Offline

Сообщений: 2137

S0mbre


WWW
« Ответ #1 : 31 января 2013, 11:03:34 »

Спасибо за новость. Кто будет пробовать, отпишитесь тут об ощущениях ))
Записан
Kray74
Посты на падонкаффском принципиально не читаю.
Участник
**

Сказали спасибо: +81/-1
Offline Offline

Сообщений: 366


« Ответ #2 : 31 января 2013, 11:08:56 »

Н-да, ну и цены у вас Грустный
Записан
S0mbre
Глобальный модератор
***

Сказали спасибо: +1113/-22
Offline Offline

Сообщений: 2137

S0mbre


WWW
« Ответ #3 : 31 января 2013, 11:16:31 »

Еще ссылка  Улыбка
Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг
**

Сказали спасибо: +350/-28
Offline Offline

Сообщений: 2181


« Ответ #4 : 01 февраля 2013, 04:44:01 »

Н-да, ну и цены у вас Грустный
Ага, RAD Studio дешевле стоит...
Записан
S0mbre
Глобальный модератор
***

Сказали спасибо: +1113/-22
Offline Offline

Сообщений: 2137

S0mbre


WWW
« Ответ #5 : 01 февраля 2013, 16:26:23 »

Про цены - разговор отдельный  Улыбка
Теперь про функционал. Есть некоторые (мягко говоря) вопросы к анализатору:
1. Переход по двойному щелчку на найденной "ошибке" очень редко открывает нужный файл и строку кода, хотя показывает правильно. Ребятам надо поработать над взаимодействием с IDE (Tools API). Пока что этот баг совершенно не оправдывает стоимость продукта  В замешательстве
2. Поиск оптимизации не различает между пользовательским кодом (например, пользовательскими функциями) и автоматически генерируемым студией. В частности, оптимизатор, предлагающий везде заменить параметры функций типа (const) String на ссылки, т.е. (const) String&, предлагает эти замены даже для обработчиков событий опубликованных компонентов. Конечно, программист не может произвольно заменить объявление обработчика события!
3. Многие "оптимизации" выглядят сомнительными. Та же замена строки на ссылку не всегда есть хорошо, в частности, для небольших строк копирование происходит (почти) с такой же скоростью. Конечно, отдельные оптимизации можно отключить в настройках.
4. Даже в больших проектах анализатор находит мало предложений оптимизации и ошибок - в основном только пресловутую замену byval -> byref. Может, я такой крутой или анализатор недостаточно суров?  Веселый
5. Есть и "мелкие" баги. Например, окно прогресса анализа всегда показывает 6 файлов. Может это только в триал-версии?
Записан
Andrey_Karpov
Участник
**

Сказали спасибо: +3/-1
Offline Offline

Сообщений: 14


« Ответ #6 : 04 февраля 2013, 09:48:17 »

1. Про переходы. Не могли бы вы прислать проект с cpp-файлом, на котором есть промах. Тогда мы бы смогли посмотреть, почему такая беда.
2. Тут недостаток, признаем. Подумаем.
3. У нас все-таки не профайлер и микрооптимизации далеко не ключевая возможность продукта, а скорее приятное дополнение.
4. Тут как повезет. Но обычно люди находят интересные ошибки.
5. Вы не путаете, может быть 6 проектов, а не файлов? Если именно файлов, то опять же будем благодарны за проект для повторения.
« Последнее редактирование: 04 февраля 2013, 10:27:52 от Andrey_Karpov » Записан
Andrey_Karpov
Участник
**

Сказали спасибо: +3/-1
Offline Offline

Сообщений: 14


« Ответ #7 : 04 февраля 2013, 10:05:49 »

P.S. S0mbre, спасибо за конструктивную критику.
Записан
S0mbre
Глобальный модератор
***

Сказали спасибо: +1113/-22
Offline Offline

Сообщений: 2137

S0mbre


WWW
« Ответ #8 : 04 февраля 2013, 14:25:08 »

Сделал более подробное тестирование вашего продукта.

Здесь тестовые проекты (группа из 3 проектов) + пруфскины с доказательством багов.

Некоторые выводы:
1. Переходы точно не работают, если файл закрыт (т.е. если вкладка с файлом не отображается). Если файл открыт, переход работает. Однако в том и другом случае файл является частью проекта, т.е. это баг. Если подробнее, необходимо вызвать метод OpenModule интерфейса IOTAModuleInfo, который получаем из проекта (IOTAProject) вызовом метода GetModule.
2. Кроме пресловутой оптимизации 801, ошибок анализатор не ловит, даже если они нарочито внесены в проект (см. пруфскин). Для анализа брались примеры с вашего сайта.
3. Количество файлов показывает всегда неверно (см. пруфскины).

Отсюда выводы:
1. Точно ли анализатор хорошо работает с препроцессором?
2. Насколько хорошо понятие "встраивания" PVS в студию? Это только на примитивном уровне (анализ ПГ / проекта / файла) и "переход" к строкам или настоящее встраивание, которое предполагает знание библиотек VCL (=> VCL RTTI), RTL, реализации Dinkumware STL, ToolsAPI и прочих специфических систем?

С вас ящик коньяку  Подмигивающий
Записан
Andrey_Karpov
Участник
**

Сказали спасибо: +3/-1
Offline Offline

Сообщений: 14


« Ответ #9 : 04 февраля 2013, 17:12:18 »

Плагин PVS-Studio создан на основе C#/.NET/WinForms и использует единые компоненты как в версии для Microsoft Visual Studio, так и для Embarcadero RAD Studio. В частности, для интеграции с RAD Studio плагин использует COM интерфейсы Open Tools API (OTA), объявленные в файле Borland.Studio.ToolsAPI.dll, т.е. реализует интерфейс IOTAWizard. Из этого следует, что плагин не имеет доступа к нативным для RAD Studio VCL, RTL и т.п. (чем, в частности, объясняется невозможность докинга у MDI окна вывода результатов).

В выложенном Вами примере переходы по диагностическим сообщения у нас работают корректно для всех файлов, в том числе и для закрытых. Для перехода к строке используются метод OpenFile интерфейса IOTAActionService (открытие файла в IDE), а затем метод FindModule интерфейса IOTAModuleServices для получения ссылки на объект IOTAModule. Такой способ позволяет открывать файл (и соответствующий модуль), даже если он не принадлежит ни к одному из открытых проектов (IOTAProject), как Вы предлагали. Как видно, закрытый файл всегда открывается перед переходом, конечно если он существует в файловой системе. Заметьте, что для перехода (и соответственно открытия файла) необходимо сделать двойной клик по строке с диагностическим сообщение, после того, как окно получит фокус.

На всех наших тестовых системах данный метод работал без ошибок, возможно у Вас есть идеи, по каким причинам он не корректен в Вашем случае?

Касательно количества проверяемых файлов — оно указано корректно. Анализатор проверяет (и соответственно учитывает в диалоговом окне) только cpp файлы. Точнее, анализатор сначала вызывает препроцессор, который генерирует промежуточный i. Файл (с раскрытыми макросами и включёнными заголовочными файлами), а затем проверяет уже этот файл. Т.о. заголовочные файлы не учитываются при подсчёте общего количества проверяемых файлов.

Из вышесказанного следует, что для корректной работы анализатора проверяемый cpp файл должен компилироваться. Ваш же тестовый файл __testunit__.cpp содержит множество ошибок компиляции, не компилируется, и как следствие, ошибки в нём не находятся анализатором.
Ошибка v008 означает, что скорее всего препроцессор для данного файла отработал с ненулувым кодом ошибки. Если файл не компилируется в IDE, то это корректное поведение. Если же он компилируется, то просим Вас прислать нам .cfg файлы (.pvs-studio.cfg и .cl.cfg), которые можно получить с помощью настройки (PVS-Studio -> Options -> Common Analyzer Settings -> Remove Intermediate Files -> False). Файлы должны появиться в одной папке с исходным cpp файлом.
Записан
S0mbre
Глобальный модератор
***

Сказали спасибо: +1113/-22
Offline Offline

Сообщений: 2137

S0mbre


WWW
« Ответ #10 : 05 февраля 2013, 08:38:41 »

Доступ к нативным компонентам IDE можно реализовать через интерфейсы INTA... В частности, докинг можно осуществить при помощи реализации INTACustomDockableForm с последующей регистрацией INTAServices::RegisterDockableForm. Конечно, окно придется создавать с нуля, для студии (если надо). Да и что стоит подключить vcl к вашему проекту? Мне кажется идея одного-единственного проекта под различные IDE не совсем верна. Чтобы на самом деле показать "товар лицом" надо в идеале выпустить отдельные продукты для каждой поддерживаемой IDE.

Что касается открытия файлов, у меня не открывает. И (о да!) я сообразил про двойной щелчок и фокус окна Рука-лицо но все равно не работает. Ваша реализация не совсем верная. IOTAActionServices::OpenFile не возвращает интерфейс модуля, а просто булев результат. Вероятность ошибки кроется в передаче имени файла в качестве параметра. Надо использовать более надежную цепочку:
Код
_di_IOTAModuleServices ModuleServices = NULL;
assert(BorlandIDEServices->Supports(ModuleServices));
_di_IOTAProject Proj = ModuleServices->GetActiveProject();
assert(Proj!=NULL);
const int ModuleCount = Proj->GetModuleCount();
for(int i=0; i<ModuleCount; i++) {
  _di_IOTAModuleInfo ModuleInfo = Proj->GetModule(i);
  _di_IOTAModule Module = ModuleInfo->OpenModule();
  // далее работа с открытым модулем...
}
 

PS. Моя система (если это имеет значение) - Win XP SP3 Professional (2002). Версию RAD Studio прислал в скриншоте ранее.

По кол-ву файлов я понял. Но все равно (ИМХО) было бы нагляднее в окне прогресса показать работу с физическими, а не виртуальными файлами.

Что касается файла __testunit__.cpp - он у меня компилируется! И просто включенный в проект, и даже если подключить его к одному из общих хедеров - компилится 100%. То есть препроцессор его запросто переваривает. Где вы видите в этом файле ошибки компиляции? С точки зрения языка, там все нормально. Просто анализатор его "не видит". *.cfg файлы пришлю на мыло.
Записан
S0mbre
Глобальный модератор
***

Сказали спасибо: +1113/-22
Offline Offline

Сообщений: 2137

S0mbre


WWW
« Ответ #11 : 05 февраля 2013, 09:22:20 »

Пардон, при повторной попытке __testunit__.cpp при компиляции стал выявлять ошибки. Я его немного подправил и теперь PVS находит ошибки анализатора (см. скриншот). Так что с этим все нормально  Улыбка

Содержание файлов:
Код
//---------------------------------------------------------------------------
// __testunit__.h
//---------------------------------------------------------------------------
 
//----- Опечатки в именах переменных
struct POINT_
{
int x, y;
};
 
struct CSize
{
 CSize(POINT_ pt) { cx = pt.x; cx = pt.y; }
 int cx, cy;
};
 
//---------------------------------------------------------------------------
// __testunit__.cpp
//---------------------------------------------------------------------------
 
#include "__testunit__.h"
#include <string.h>
#pragma package(smart_init)
 
#define CONT_MAP_MAX 50
 
void Foo()
{
//----- Не до конца очищенный массив
int nArray[CONT_MAP_MAX];
memset(nArray, -1, CONT_MAP_MAX);
 
//----- Забытое разыменование указателя
char* pSlash = "splash";
 
while(pSlash) {
 pSlash++;
 if (pSlash != '\0') *pSlash = '!';
}
 
//----- Некорректный цикл
int i, k, l;
for (i=0; i<10; i++) {
 for (k=i; i<10; k++)
 {
if (pSlash[k]=='>') break;
 }
 l = k;
}
}
 
Записан
S0mbre
Глобальный модератор
***

Сказали спасибо: +1113/-22
Offline Offline

Сообщений: 2137

S0mbre


WWW
« Ответ #12 : 05 февраля 2013, 09:30:17 »

Еще предложение - локализовать ваш продукт для русскоязычных пользователей.
И еще: у меня кончились триальные клики  Улыбка хотя конечно они не сильно помогают...
Записан
Andrey_Karpov
Участник
**

Сказали спасибо: +3/-1
Offline Offline

Сообщений: 14


« Ответ #13 : 05 февраля 2013, 09:57:04 »

>Еще предложение - локализовать ваш продукт для русскоязычных пользователей.
У нас на сайте есть полноценная русскоязычная документация: http://www.viva64.com/ru/d/
Записан
S0mbre
Глобальный модератор
***

Сказали спасибо: +1113/-22
Offline Offline

Сообщений: 2137

S0mbre


WWW
« Ответ #14 : 05 февраля 2013, 11:30:04 »

>Еще предложение - локализовать ваш продукт для русскоязычных пользователей.
У нас на сайте есть полноценная русскоязычная документация: http://www.viva64.com/ru/d/

я имею в виду локализацию GUI и сообщений анализатора.
Записан
Andrey_Karpov
Участник
**

Сказали спасибо: +3/-1
Offline Offline

Сообщений: 14


« Ответ #15 : 13 февраля 2013, 16:43:57 »

Благодаря S0mbre было поправлено несколько важных ошибок и выпущена новая версия 5.01. Спасибо!

Дополнительно, эта версия теперь поддерживает больше редакций RAD Studio. А именно:

Embarcadero RAD Studio XE3     C, C++, C++11
Embarcadero RAD Studio XE2    C, C++, C++0x
Embarcadero RAD Studio XE    C, C++
Embarcadero RAD Studio 2010    C, C++
Embarcadero RAD Studio 2009    C, C++
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в: