PVS-Studio vs Clang

    PVS-Studio vs CLANG
    Мы случайно проверили проект Clang. Думаю, результат будет любопытен ряду разработчиков. Подробности под катом.

    PVS-Studio сейчас использует внешний препроцессор Microsoft Visual C++, что является существенным недостатком. Препроцессор Visual C++ крайне медленный и имеет ошибки, которые мы не можем исправить. Да, пусть вас не удивляет, что препроцессор работает из вон рук плохо, но это не мешает быстро и правильно компилировать файлы в Visual Studio. Как именно устроен cl.exe я не знаю, но по косвенным уликам могу предположить, что имеется два совершенно разных алгоритма препроцессирования, используемых для компиляции и для создания*.i файлов. Видимо, так удобнее в плане архитектуры компилятора.

    В последнее время мы активно занялись поиском альтернативного решения для препроцессирования файлов. И по все видимости, наш выбор остановится на препроцессоре, реализованном в Clang. Предварительные замеры показывают, что он работает в несколько раз быстрее cl.exe, что очень приятно и полезно.

    Clang — это новый компилятор для C-подобных языков (C, C++, Objective-C ,Objective-C++, в процессе поддержка C++11). Разработка спонсируется корпорацией Apple. Одной из сильных сторон компилятора Clang является большое количество правил статического анализа кода. Практически, Clang уже используется Apple как инструмент статического анализа.

    Clang изначально спроектирован для максимального сохранения информации в ходе процесса компиляции [1]. Эта особенность позволяет Clang создавать развернутые контекстно-ориентированные сообщения об ошибках, понятные как для программистов, так и для сред разработки. Модульный дизайн компилятора позволяет использовать его в составе среды разработки для подсветки синтаксиса и рефакторинга.

    Так что, по хорошему, PVS-Studio, возможно, стоило бы основывать именно на Clang, а не на VivaCore [2]. Но теперь уже поздно и всё не так однозначно. В этом случае мы бы слишком сильно зависели от возможностей сторонней библиотеки. Да и поддерживать Microsoft Specific в проекте Clang не спешат.

    Однако, мы отвлеклись. Наиболее интересно проверить один анализатор кода другим анализатором кода. Мы это и сделали, раз всё равно уже начали изучать проект Clang.

    К сожалению, полноценное сравнение сделать невозможно. Было бы замечательно проверить Clang с помощью PVS-Studio и наоборот. А потом посчитать количество найденных ошибок на одну тысячу строк. Беда в том, что мы можем проверить Clang, а он нас нет. В Clang поддержка MSVC экспериментальная. Плюс дело осложняется тем, что в PVS-Studio уже используются возможности C++11. Простая попытка скомпилировать приводит к ошибкам вида 'Эти расширения языка ещё не поддерживаются'.

    Придется ограничиться тем, что удалось найти PVS-Studio в коде Clang. Естественно то, что будет описано в статье, это не все ошибки, которые были найдены. Clang это около 50 мегабайт исходного кода. Я уведомлю разработчиков о найденных дефектах и, если им будет интересно, то они сами смогут проверить свой проект и изучить весь список потенциальных ошибок. Впрочем, они про нас слышали и обсуждали некоторые наши диагностики.

    Посмотрим, что мы нашли интересненького. Практически все найденные ошибки, являются ошибками Copy-Paste.

    Ошибка Copy-Paste N1


    static SDValue PerformSELECTCombine(...)
    {
      ...
      SDValue LHS = N->getOperand(1);
      SDValue RHS = N->getOperand(2);
    
      ...
      if (!UnsafeFPMath &&
          !DAG.isKnownNeverZero(LHS) && !DAG.isKnownNeverZero(RHS))
      ...
      if (!UnsafeFPMath &&
          !DAG.isKnownNeverZero(LHS) && !DAG.isKnownNeverZero(LHS))
      ...
    }

    Диагностика PVS-Studio: V501 There are identical sub-expressions '!DAG.isKnownNeverZero (LHS)' to the left and to the right of the '&&' operator. LLVMX86CodeGen x86isellowering.cpp 11635

    В начале код одновременно работает с LHS и с RHS, а потом только с LHS. Причиной тому, видимо, стала описка или скопированный фрагмент строки. Как я понимаю, во втором случае также должна присутствовать переменная RHS.

    Ошибка Copy-Paste N2


    MapTy PerPtrTopDown;
    MapTy PerPtrBottomUp;
    
    void clearBottomUpPointers() {
      PerPtrTopDown.clear();
    }
    
    void clearTopDownPointers() {
      PerPtrTopDown.clear();
    }

    Диагностика PVS-Studio: V524 It is odd that the body of 'clearTopDownPointers' function is fully equivalent to the body of 'clearBottomUpPointers' function (ObjCARC.cpp, line 1318). LLVMScalarOpts objcarc.cpp 1322

    Классический Copy-Paste. Функция была скопирована. Было изменено её имя, но не само тело. Правильный вариант:
    void clearBottomUpPointers() {
      PerPtrBottomUp.clear();
    }


    Ошибка Copy-Paste N3


    static Value *SimplifyICmpInst(...) {
      ...
      case Instruction::Shl: {
        bool NUW = LBO->hasNoUnsignedWrap() && LBO->hasNoUnsignedWrap();
        bool NSW = LBO->hasNoSignedWrap() && RBO->hasNoSignedWrap();
      ...
    }

    Диагностика PVS-Studio: V501 There are identical sub-expressions 'LBO->hasNoUnsignedWrap ()' to the left and to the right of the '&&' operator. LLVMAnalysis instructionsimplify.cpp 1891

    По всей видимости, хотели написать так:
    bool NUW = LBO->hasNoUnsignedWrap() && RBO->hasNoUnsignedWrap();


    Ошибка Copy-Paste N4


    Sema::DeduceTemplateArguments(...)
    {
      ...
      if ((P->isPointerType() && A->isPointerType()) ||
          (P->isMemberPointerType() && P->isMemberPointerType()))
      ...
    }

    Диагностика PVS-Studio. V501 There are identical sub-expressions 'P->isMemberPointerType ()' to the left and to the right of the '&&' operator. clangSema sematemplatededuction.cpp 3240

    Это просто случай, в отличие от пятого примера. Понятно, что хотели написать так:

    (P->isMemberPointerType() && A->isMemberPointerType())

    Ошибка Copy-Paste N5


    static bool CollectBSwapParts(...) {
      ...
      // 2) The input and ultimate destinations must line up: if byte 3 of an i32
      // is demanded, it needs to go into byte 0 of the result.  This means that the
      // byte needs to be shifted until it lands in the right byte bucket.  The
      // shift amount depends on the position: if the byte is coming from the high
      // part of the value (e.g. byte 3) then it must be shifted right.  If from the
      // low part, it must be shifted left.
      unsigned DestByteNo = InputByteNo + OverallLeftShift;
      if (InputByteNo < ByteValues.size()/2) {
        if (ByteValues.size()-1-DestByteNo != InputByteNo)
          return true;
      } else {
        if (ByteValues.size()-1-DestByteNo != InputByteNo)
          return true;
      }
      ...
    }

    Диагностика PVS-Studio: V523 The 'then' statement is equivalent to the 'else' statement. LLVMInstCombine instcombineandorxor.cpp 1387

    А это пример сложной ситуации. Я даже не уверен до конца ошибка здесь или нет. Комментарий мне тоже не помогает. Здесь анализировать код должны создатели. Но всё-таки я думаю, что здесь пример ошибки при Copy-Paste.

    Думаю, про Copy-Paste пока достаточно, ведь есть некоторое количество и других типов ошибок.

    Вот, например, классическая ошибка в switch


    void llvm::EmitAnyX86InstComments(...) {
      ...
      case X86::VPERMILPSri:
        DecodeVPERMILPSMask(4, MI->getOperand(2).getImm(),
                            ShuffleMask);
        Src1Name = getRegName(MI->getOperand(0).getReg());
      case X86::VPERMILPSYri:
        DecodeVPERMILPSMask(8, MI->getOperand(2).getImm(),
                            ShuffleMask);
        Src1Name = getRegName(MI->getOperand(0).getReg());
        break;
      ... 
    }

    Диагностика PVS-Studio: V519 The 'Src1Name' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 211, 215. LLVMX86AsmPrinter x86instcomments.cpp 215

    В большом коде просто неизбежны подобные ошибки. Уж очень опасен оператор switch. Можно сколько угодно хорошо знать, как он работает, но всё равно забыть этот проклятый 'break'.

    Есть ряд если и не ошибок, то явно бестолковых или подозрительных действий.

    Бестолковое действие N1, которое может быть ошибкой


    AsmToken AsmLexer::LexLineComment() {
      // FIXME: This is broken if we happen to a comment at the end of a file, which
      // was .included, and which doesn't end with a newline.
      int CurChar = getNextChar();
      while (CurChar != '\n' && CurChar != '\n' && CurChar != EOF)
        CurChar = getNextChar();
      ...
    }

    Диагностика PVS-Studio: V501 There are identical sub-expressions to the left and to the right of the '&&' operator: CurChar != '\n' && CurChar != '\n' LLVMMCParser asmlexer.cpp 149

    Скорее всего, вторая проверка CurChar != '\n' здесь лишняя. Но, возможно, это ошибка и должно быть написано:
    while (CurChar != '\n' && CurChar != '\r' && CurChar != EOF)


    Бестолковое действие N2, которое точно не является ошибкой


    std::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const {
      ...
      ParmOffset = PtrSize;
      // Argument types.
      ParmOffset = PtrSize;
      ...
    }

    Диагностика PVS-Studio: V519 The 'ParmOffset' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 3953, 3956. clangAST astcontext.cpp 3956

    Бестолковое действие N3, которое я затрудняюсь описать


    static unsigned getTypeOfMaskedICmp(...)
    {
      ...
      result |= (icmp_eq ? (FoldMskICmp_Mask_AllZeroes |
                            FoldMskICmp_Mask_AllZeroes |
                            FoldMskICmp_AMask_Mixed |
                            FoldMskICmp_BMask_Mixed)
                         : (FoldMskICmp_Mask_NotAllZeroes |
                            FoldMskICmp_Mask_NotAllZeroes |
                            FoldMskICmp_AMask_NotMixed |
                            FoldMskICmp_BMask_NotMixed));
      ...
    }

    Диагностика PVS-Studio:

    V501 There are identical sub-expressions 'FoldMskICmp_Mask_AllZeroes' to the left and to the right of the '|' operator. LLVMInstCombine instcombineandorxor.cpp 505

    V501 There are identical sub-expressions 'FoldMskICmp_Mask_NotAllZeroes' to the left and to the right of the '|' operator. LLVMInstCombine instcombineandorxor.cpp 509

    Не знаю, это простые дубликаты или должно быть написано иное условие. Затрудняюсь предположить, что здесь должно быть на самом деле.

    Есть код, который просто потенциально опасен.


    Этот код будет работать до тех пор, пока два enum имеют схожую структуру.
    enum LegalizeAction {
      Legal,      // The target natively supports this operation.
      Promote,    // This operation should be executed in a larger type.
      Expand,     // Try to expand this to other ops, otherwise use a libcall.
      Custom      // Use the LowerOperation hook to implement custom lowering.
    };
    
    enum LegalizeTypeAction {
      TypeLegal,           // The target natively supports this type.
      TypePromoteInteger,  // Replace this integer with a larger one.
      TypeExpandInteger,   // Split this integer into two of half the size.
      ...
    };
    
    LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const;
    
    EVT getTypeToExpandTo(LLVMContext &Context, EVT VT) const {
      ...
      switch (getTypeAction(Context, VT)) {
      case Legal:
        return VT;
      case Expand:
      ...
    }

    Диагностика PVS-Studio:

    V556 The values of different enum types are compared: switch(ENUM_TYPE_A) { case ENUM_TYPE_B:… }. LLVMAsmPrinter targetlowering.h 268

    V556 The values of different enum types are compared: switch(ENUM_TYPE_A) { case ENUM_TYPE_B:… }. LLVMAsmPrinter targetlowering.h 270

    Имея TypeLegal созвучно Legal, а имя TypeExpandInteger созвучно Expand. Это и стало причиной опечатки. Код работает только потому, что повезло и значения этих имен совпадают.

    Заключение


    Страшно, когда в компиляторе ошибки находятся? :)

    P. S.


    Кажется, я поспешил хвалить Clang. Только что наткнулись на ситуацию, когда при препроцессировании он портит код. Имеем вот такой фрагмент в atlcore.h:
    ATLASSUME(p != NULL); // Too expensive to check separately here
    if (*p == '\0')  // ::CharNextA won't increment if we're at a \0 already
      return const_cast<_CharType*>(p+1);

    Препроцессор Clang превращает это в:
    do { ((void)0);
    #pragma warning(push)
    #pragma warning(disable : 4548)
     do {__noop(!!(p != 0));} while((0,0)
    #pragma warning(pop)
     ); } while(0); // Too expensive to check separately here if (*p == '\0') // ::CharNextA won't increment if we're at a \0 already
      return const_cast<_CharType*>(p+1);

    Он разместил оператор 'if' после комментария и получилось, что «if (*p == '\0')» теперь тоже комментарий. В результате имеем некорректный код. Эх, нет счастья в жизни программистов.

    Дополнительные ссылки.


    1. Wikipedia. Clang. http://www.viva64.com/go.php?url=713
    2. Библиотека VivaCore. http://www.viva64.com/ru/vivacore-library/
    PVS-Studio
    Static Code Analysis for C, C++, C# and Java

    Comments 88

      +1
      Ждем, когда PVS-студия станет бесплатной и без этих микрософтовских заморочек. Вам главное не упустить момент, когда сообщество решит «Хватит жить без статического анализа», и не станет пилить свой PVS сразу с Clang в качестве препроцессора.
        +11
        Разработчиков тогда из своего кармана будете кормить?
          +2
          Наверное имелось ввиду «бесплатно для некоммерческого использования». Хотя мне кажется они уже дают бесплатный дистрибутив для GPL-проектов.
            +12
            Мы готовы предоставить бесплатную лицензию сроком на 1 месяц студентам, авторам статей в тематических IT изданиях и блогах. А также разработчикам бесплатных open-source программ, если они хотят проверить свои проекты на наличие в них ошибок диагностируемых нашим анализатором.

            Если вас заинтересовало наше предложение, то просим написать об этом на support@viva64.com с темой PVS-Studio free license initiative.
            –3
            <sarcasm>Ну почему же, конкретно для Visual Studio можно оставить платную версию по нынешней цене в €3500 в год.</sarcasm>
            +3
            Намного дешевле купить готовый анализатор, чем создавать свой
              0
              Но только не для сообщества, иначе бы не было целых двух опенсорс браузеров, например.
                –3
                Открытый Firefox знаю. А второй? Chrome закрыт, Opera закрыта, может IE?
                  +2
                  Хромиум видимо имеется в виду, а ещё их куда больше чем два.
                    0
                    Я понимаю, что имеется ввиду Chromium (мы его проверяли). Я к тому что Chrome все-таки не такой уж и открытый. И точно не неким мифическим «сообществом» делается.
                      +2
                      Условия предоставления услуг Google Chrome

                      Настоящие Условия предоставления услуг распространяются на исполняемый код Google Chrome. Исходный код Google Chrome предоставляется бесплатно на условиях лицензионных соглашений на программное обеспечение с открытым исходным кодом по адресу code.google.com/intl/ru/chromium/terms.html.


                      www.google.com/chrome/eula.html
                        +1
                        >Я понимаю, что имеется ввиду Chromium (мы его проверяли).

                        И чем вам Хромиум не браузер?
                      0
                      Закрытый хром, правда?? А это тогда что?

                        +1
                        Что это?
                          +1
                          А это парсер сожрал ссылку на проект Хромиум :)
                            –1
                            Ну про Хромиум мы знаем и уже проверяли.
                        +1
                        Уйма браузеров на вебките(midori, arora, epiphany и т.д), браузер на KHTML — konqueror.
                        Кроме этого есть links, elinks, w3m. Есть dillo.
                    +19
                    Мне странно Ваше желание. Мне кажется, Вы не ждете, что в магазинах будут бесплатно раздавать отвертки и гаечные ключи. То, что цена копирования экземпляра программы равна нулю, не означает, что и цена создания продукта равна нулю. Также, Вы забываете, что это класс инструментов с очень дорогой поддержкой. Чтобы ответить на вопрос пользователя/потенциального пользователя требуется квалифицированный человек, а не девочка в торговом центре, которая говорит, где можно выбрать люстру. Часто вопросы требуют серьезного изучения и большого времени на ответ. Это очень дорого. Вот пример, одной такой переписки. Это только ответы на вопросы, а ещё есть работа с пожеланиями пользователей и реализация их в новых версиях.

                    Продукт подобный PVS-Studio может стать бесплатным только в случае, если кто-то его будет финансировать со стороны. Как, например, Apple финансирует Clang.
                      +4
                      Ждем когда вас купят Microsoft :)
                        +1
                        У MS есть свой анализатор. Не такой развитый, возможно. Посмотрим, что изменится с MSVS.vNext
                          +2
                          Было бы неплохо, если бы MS начала заниматься правкой своих С++ инструментов, складывается впечатление, что они вообще на native разработку забили.
                            0
                            Вы отстали от жизни. Наберите в гугле C++ Renaissance
                              +1
                              Я слышал, что в MS сейчас «ренесанс С++», но в текущих продуктах компании разработка на C++ похожа на печатание в блокноте в сравнении с тем же C#.
                                +1
                                Обещали многое добавить в следующей версии. Поживем — увидим. Да и VS2010 это хороший шаг вперед.
                                  0
                                  >Да и VS2010 это хороший шаг вперед.
                                  У меня есть пару проектов на ATL, которые стабильно роняют VS2010 при компиляции, в то время как VS08 все работает нормально )
                            +10
                            Да мы уже сами ходим все так:
                            image
                          0
                          Я уже спрашивал разработчиков PVS. Открывать сорцы они не планируют, поэтому сообщество поступит именно так — пилить свой PVS на Clang.
                            0
                            Мне вот понравилась идея запилить плагин для Qt в clang: чтобы избавится от moc'а и получить возможность глубже анализировать кутешные фичи и нормально их на уровне компилятора оптимизировать.
                          +10
                          Я давно умер как программист, но всё равно с удовольствием читаю Ваши статьи об PVS-Studio.
                          Рад за русский продукт.
                          Лошадка-которая-Единорог-рыгающий-радугой супер, сразу её визуально видно на главной и рука тянется Подробнее.
                          • UFO just landed and posted this here
                              +50
                              Можно проголосовать. Кому нравится лого, ставьте плюсик этому моему комментарию. Кому не нравится — ставьте плюсик комменту XPilot.
                                –8
                                Не хватает заряда проголосовать, но единорог отвртителен. Мало того, что блюющее существо вызывает соответствующий рефлекс, но и радуга — символ людей с нетрадиционной ориентацией. Всё сугубо на правах ИМХО, естественно.
                                  +14
                                  А радуга на небе у вас тоже неприятные ощущения вызывает?
                                    0
                                    Совсем нет, но радуга на логотипе лично у меня вызывает такую ассоциацию. Возможно потому, что пришлось прожить несколько лет там, где эти флаги можно встретить на каждом углу и они означают они там исключительно одно. Речь о Сан-Франциско.
                                      0
                                      на гей-флаге только 6 цветов :)
                                        –1
                                        Ваша правда, но ассоциация остаётся. Всё равно на радуга на логотипе — игра на гране фола.
                                        • UFO just landed and posted this here
                                    +9
                                    Спасибо за мнение. Теперь я тоже считаю, что «официальные» картинки лучше. Например как эта:



                                    Сразу видно, что такая компания не врет, все делает для людей, и вообще они — молодцы! Не то что мы.
                                      +3
                                      Сами попросили высказать мнение. И не надо путать имидж продукта и непосредственно логотип. Корпоративный стиль Аэрофлота — очень приятный. Другое дело, что вы о нём думаете как о компании. К слову сказать, тот же Аерофлот иногда удивляет очень хорошим обслуживанием на международных рейсах. Хоть это и не отменяет их многочисленные косяки и идиотизм. Но речь не о нём.

                                      Для тех кто в танке — речь о субъективном восприятии вашего логотипа как такого. Извините, если такое мнение вам неприятно.
                                      • UFO just landed and posted this here
                                        +14
                                        Меня больше возмущает что гомосеки заграбастали радугу.
                                        А блюющий радугой единорог — это круто.
                                          +10
                                          На счёт радуги — решительно согласен :) опошлили такой светлый образ.
                                            +4
                                            а что они сделали с совершенно нормальным раньше словом GAY — и сказать страшно.
                                      +2
                                      Ничего плохого не вижу в чем-то неформальном. Пусть даже и в йа-креведке. Я наоборот отношусь с настороженностью к компаниям, у которых все в официальном тоне.
                                        +3
                                        А пока идет голосование, выскажу свой взгляд. Неужели абстрактные картинки чудесных телефонов лучше? Неужели абстрактные блоги не о чем, которые пишутся крупными компаниями «потому что так надо» и«потому что надо освоить бюджет» лучше? Есть много хороших блогов крупных компаний, в том числе и на Хабре, но согласитесь, что большинство «корпоративных» текстов скучны? А мы маленькая живая компания. С которой можно пообщаться. И эта символика — способ выделиться.

                                        P.S. Продолжаем голосовать.
                                          +2
                                          я чуток устал от текстов «серьезных» компаний
                                          серьезное лицо ещё не признак ума
                                            0
                                            Я тоже от них устал. Но однообразные топики «Мы проверили проект *** и в очередной раз убедились, что копи-паст — зло, покупайте наших слонов» с неизменным блюющим единорогом тоже надоели, если честно.
                                            Первые 3-4 раза было свежо и интересно, дальше информативность свелась к полному нулю, а единорог задолбал.

                                            И ладно ещё, если бы делали это в собственном корпоративном блоге (кстати, интересно, почему до сих пор не завели?) — так нет же: в профильных блогах «С++», «Ревизия кода», теперь вот«Компиляторы», к которым сами топики относятся с ну о-о-очень большой натяжкой.
                                              +1
                                              Это как любимый сериал… опять знакомые лица, но новая ситуация.

                                              Мне интересно кого проверяют в этот раз… и очень интересно, когда лажают крупные компании. Для меня это как сбить спесь с лица. Маркетинговый бред от дядек в костюмах и с тётеньками на картинках, показывающие иллюзорное светлое будущее их софтварных компаний.
                                              И тут гадский PVS со своей «лошадью», которую рвёт от плохого кода =)

                                            +6
                                            Компания типа Intel находится в творческих поисках наилучшей КДПВ. Но PVS Studio уже использует блюющую радугой лошадку. Дабы не доводить до судебных разборок, мы решили никогда не использовать блюющую лошадку в своих постах.
                                          +2
                                          Ждем когда PVS-Studio будет аналазировать свой собственный код. Было бы интересно посмотреть, какие ошибки они нашли у себя (:
                                            +2
                                            Уже же вроде писали, что они перед коммитами себя анализируют и правят, поэтому нарыть материала на анализ самих себя не могут.
                                              0
                                              Думаю, они их все исправили ;)
                                                +1
                                                Тестирование происходит каждую ночь. А поскольку у нас самих уже достаточно давно включен инкрементальный анализ, всё, что иногда находится, тут же исправляется. Учет найденного я не вёл и написать заметку про это сложно. Из примеров, могу показать сходу только случай, который нашел отражение в документации.
                                                +19
                                                Только мне кажется странным рекламировать свой сугубо MSVS addicted продукт на проектах которые отродясь не разрабатывались на MSVS? Лично я взял наш крупный embedded проект, потратил несколько часов на возню с MSVS, сделал несколько разных попыток перенести наш сложный build environment c тысячами файлов и пятёркой разных embedded конфигураций под MSVS — плюнул на этот изврат и занялся более полезным делом. А ведь мог бы и послать запрос руководству на закупку 10-20 лицензий, если бы нашёл проект полезным.

                                                Может вместо такого странного пиара вы всё же хотя бы сделаете плагин для eclipse? Проектов на с++ которые собираются и разрабатываются НЕ под msvs в разы больше чем под ней: всякие embedded'ы, linux, mobile, а узкоспециализированных кроссплатформенных проектов — вообще не счесть. Вы не думали об этом? Если вы будете и дальше следовать своему принципу «пока нам не заказали — мы и не делаем» то вы многого не добьётесь и все ваши подходы к клиентам описанные ранее будут никому не нужны. Выглядит как «придите и попросите нас выпустить продукт для такой-то платформы, а мы подумаем»… Очень странный подход как по мне. Это вы сами должны переживать и думать «как бы нам захватить рынок на разных платформах?», а не потенциальные клиенты должны вас уговаривать.

                                                Всё сказанное сугубо личное имхо, а вы конечно же сами себе кузнецы своего маркетингового счастья. =)
                                                  +12
                                                  >> Если вы будете и дальше следовать своему принципу «пока нам не заказали — мы и не делаем» то вы многого не добьётесь и все ваши подходы к клиентам описанные ранее будут никому не нужны.

                                                  Очень и очень круто иметь версии подо все платформы. Правда даже не у всех крупных компаний это получается удачно. А мы — маленькая компания. Поэтому вместо того, чтобы иметь версию, которая «одинаково плохо работает на куче платформ», мы хотим ХОТЯ БЫ научится на одной Visual Studio работать хорошо. Хотя и так уже есть (даже в рамках этой модели) кроссплатформенность. Я имею ввиду VS2005/2008/2010. Уже ТАМ есть отличия и нюансы.

                                                  При этом пользователей Visual Studio нам удается порадовать. А если будет монстр, который и на Linux, и на Windows ТЕОРЕТИЧЕСКИ работает, то возможно пользователи VS уже будут страдать.
                                                    +3
                                                    Eclipse существует и под винду. Не обязательно сразу под все ОС, достаточно просто отвязаться от vs. У нас разработка ведётся под виндой, но никак не используя msvs tool chain. Cборки у нас идут для linux-arm, linux-x86, qnx-x86, qnx-arm, qnx-sh4… Как это всё «лёгким движением руки» засунуть под msvs? Мы юзаем gcc tool chain и всё завязано на него и eclipse под винду очень даже прекрасно хватает для такого зверинца… А если бы ваш анализатор можно было было бы засунуть на cruise contol server, который делает анализ кода после коммитов — вообще бы цены не было. Как результат нам не интересно пробовать такой продукт. В общем вам есть куда развиваться. =)

                                                    А вообще странно, что вы захардкодили свой продукт на визуал студию на столько, что «возможно пользователи VS уже будут страдать» в случае расширения поддерживаемых патформ.
                                                      +1
                                                      >> Как это всё «лёгким движением руки» засунуть под msvs?

                                                      А как нам «легким движением руки» поддержать все эти платформы?

                                                      >> А вообще странно, что вы захардкодили свой продукт на визуал студию на столько, что «возможно пользователи VS уже будут страдать» в случае расширения поддерживаемых патформ.

                                                      Да ладно… Видел я инструменты статического анализа, которые сначала неделю (условно) настраивать надо, прежде чем хоть что-то проверишь. А у нас — скачал и все, сразу работает.
                                                        +7
                                                        >> А как нам «легким движением руки» поддержать все эти платформы?
                                                        Но вы же сами вталкиваете кроссплатформенные проекты в msvs и сами своими тестами доказываете, что вашей софтине по-барабану какой код разбирать! Т.е. тут почему-то не встаёт вопрос «как нам поддерживать кросплатформенный код», но упорно сопротивляетесь отвязаться (заметьте — отвязаться, а не отказаться) от студии :)))

                                                        Если бы вы выложили на хабре статью вида «почему наш pvs-studio msvs addicted» — думаю у многих бы отпали вопросы. А так, мне как человеку, который пишет кросплаторменный код совершенно не ясно, что может быть у анализатора с++ файлов платформо-зависимого, ведь сам с++ платформо-независимый стандарт. Или у вас случай, когда финансовый вопрос определил архитектурное решение, т.е. в начале проекта первый заказчик заплатил только за разработку под msvs?

                                                        И да, я не предъявляю претензий, я просто пытаюсь понять с технической точки зрения, что вас так серьёзно останавливает. =)
                                                          0
                                                          >> Если бы вы выложили на хабре статью вида «почему наш pvs-studio msvs addicted»

                                                          Да тыщу раз все это объяснялось и даже в FAQ есть:

                                                          www.viva64.com/ru/d/0008/#ID0EZCAE
                                                        0
                                                        Как это всё «лёгким движением руки» засунуть под msvs?

                                                        Очень просто — используя CMake или аналог с самого начала разработки, тем более, что продукт кросс-платформенный.
                                                          +1
                                                          Спасибо за комментарий, кстати CMake у нас очень хорошо поддерживается.
                                                            +1
                                                            Именно в нашем проекте всё на базе cmake (хотя и это мне не сильно помогло), однако другие проекты используют jamfile'ы и совершенно кастомный билд енварнмент, который конфигурируется на стадии вытягивания его из системы контроля версий =) И вопрос к продукту тут скорее в том, чтобы отвязаться от ms tool chain и вообще не привязываться ко всяким ide.
                                                              +1
                                                              Сложно поддержать все IDE, а делать IDE-less продукт — терять клиентов. Я когда искал memory leak детектор, то отбрасывал все, что не работает со студией. Мне не удобно запускать несколько разных программ, чтобы комфортно разрабатывать, так что интеграция это нужная фича.
                                                              К тому же лучше иметь продукт с ориентацией, в том числе, на MSVS, это позволит использовать не только PVS. Все таки под MSVS много качественных продуктов и сознательно от них отказываться не стоит. Тем более, что это делать не сложно.
                                                                +3
                                                                А никто не говорит отказываться. Давным давно все нормальные ide имеют возможность подключения плагинов. Анализатор с++ кода это софтина, которая на входе принимает С++ текст и на выходе даёт отчёт. Привязку к ide для таких аналитических софтин, всегда правильнее осуществлять через плагины, где задача плагинов, взять из ide конфигурацию проектов (include paths, compiler switches, defines) и правильно подать данные к анализатору. Ну это моё видение. =)

                                                                В вашем же случае тулза для поиска memory leak не тривиальная, т.к. подразумевает вмешательство в бинарный код и тут конечно требуется тесная интеграция со средой разработки и toolchain.
                                                                  +2
                                                                  >> Анализатор с++ кода это софтина, которая на входе принимает С++ текст и на выходе даёт отчёт.

                                                                  Только пользоваться такой фигнёй совершенно неудобно. Так работает, например, PC-lint. И появляются потом к нему всякие фантики типа Visual Lint, самописные прикручивалки к IDE и к IncrediBuild.

                                                                  А у нас сразу установил и работай. Мы сами фильтруем дублирующиеся сообщения из h-файлов. Мы удобно на лету фильтруем сообщения (не надо перезапускать анализ). Мы сами используем несколько ядер. Мы умеем сохранять и открывать отчет. Нас не надо никуда хитро прописывать, чтобы мы запускались после сборки файлов. У нас удобная справочная система. У нас нормальный диалог прогресса а не чёрное окно в котором мелькают плевки анализатора. И так далее, и так далее. :)

                                                                  Лучше поддержать меньше, но сделать это хорошо и качественно.

                                                                    0
                                                                    Ну вообще тема что удобнее — гуй или коммандлайн старая и флеймовая :)

                                                                    Но если все-таки рассматривать PVS-Studio не только как инструмент рабочего места разработчика, а и как инструмент для автоматического контроля — при чек-ин-ах, например, или при билдах, то коммандлайн версия будет таки удобнее…
                                                                      0
                                                                      Вам пофлеймить или по делу? Если по делу, то все это (проверки при чекинах и билдах) есть в PVS-Studio. И давно.
                                                                        0
                                                                        Без студии и её солюшена?
                                                                          0
                                                                          Почему без студии? Со студией, так как мы используем препроцессор оттуда, заголовочные файлы также нужны. А вот солюшен не обязателен.
                                                            0
                                                            На тему PVS-Studio Standalone и Linux, возможно будет интересна вот эта новая заметка — "PVS-Studio теперь работает и без среды Visual Studio или C++Builder – проверяем препроцессированные файлы от чего угодно".
                                                          +4
                                                          Хочу немного прояснить ситуацию с Linux.

                                                          На самом деле мы хотим поддержать большее количество платформ. Но мы имеем холодную трезвую голову и не занимаемся авантюрами. У нас есть хороший иммунитет к призывам «хочется Linux версию». Мы видели, как почти умер один проект, который пытались сделать и вашим, и нашим. Была допущена ошибка, что работа на двух платформах потребует немного дополнительных усилий и это проект можно вести без увеличения команды. Однако часто это означает, что работы станет больше в 2-3 раза. Мы не хотим повторять такую ошибку.

                                                          Конечно, не во всяком проекте, поддержка другой платформы увеличивает стоимость разработки в 2 раза. Однако, в случае статического анализатора, произойдет именно это. Основная цена развития статического анализатора, не в том чтобы добавить новое правило и написать документацию. Основные трудозатраты связаны с тем, чтобы проект адекватно себя вёл в различных режимах. Здесь часто звучит, что мы поддерживаем только MSVC. А вот у меня такое осушение, что мы и так уже тянем кроссплатформенную разработку. Мы поддерживаем разные версии компилятора. Например, учитываем, что в VS2005 static_assert это может быть имя переменной, а в VS2010 это новое ключевое слово. Еще есть поддержка разных старых проектов ARMV4 и т.д. У нас разные модули расширения под разные версии Visual Studio (не дай бог вам залезть в такие дебри и узнать почему). Постоянно появляются дополнительные заплатки, чтоб, например плагин работал в русской или немецкой MSVC. У нас очень много различных тестов на базе реальных проектов. Прогон всех тестов в разных режимах (VS 2005/2008/2010) занимает около дня. Всё очень тяжело и медленно.

                                                          И вот имея всё это, я понимаю, что мы умрем, если займемся Linux. MSVC представляет собой монолит по сравнению с Linux. Если мы пойдем в том направлении, то цена разработки вырастет минимум в 2-4 раза. Общее в проектах будет только сам анализ, а это по трудозатратам 10% от всего остального. Зато в Linux мы будем иметь колоссальный зоопарк различных разностей. Очень хорошо про ад разработки статического анализа под многие системы написано в статье "Using Static Analysis to Find Bugs in the Real World".

                                                          Поэтому повернуться лицом к Linux мы можем только в двух случаях:

                                                          1) Мы естественным образом дорастем до Linux. У нас появится достаточный штат сотрудников, чтобы можно было заняться новым направлением.

                                                          2) У нас появится внешнее финансирование для этого.

                                                            +1
                                                            А есть ли какие-нибудь коммерческие предложения по портированию PVS для других платформ?
                                                              +1
                                                              Пока никто ничего коммерческого не предлагал :-)
                                                                0
                                                                Просто видел у вас в клиентах компании типа id Software, которые поддерживают очень большое количество платформ.
                                                              +1
                                                              Чётко, ясно и по-существу. =) Согласен — объём работ серьёзный. Тогда остаётся открытым один вопрос. У вас на сайте в FAQ написано:

                                                              «В других компиляторах (например, GCC) есть также специфичные конструкции, которые надо будет поддержать.… Наконец используемые наборы заголовочных (include) файлов в разных системах также различаются. И если PVS-Studio работает с заголовочными файлами Visual C++, то это совершенно не значит, что также все будет работать с заголовочными файлами GCC. Подведем итог. Разработать PVS-Studio для другой платформы можно, но это серьезная задача, которой мы заниматься не планируем.»

                                                              Зачем же тогда после этого вы берёте изначально gcc'шные проекты и прилюдно проводите анализ в своём анализаторе? :(
                                                                0
                                                                Я Вас не понимаю. Какие они GCC-шные, если они собираются Visual C++?
                                                                  0
                                                                  >> Зачем же тогда после этого вы берёте изначально gcc'шные проекты и прилюдно проводите анализ в своём анализаторе? :(

                                                                  Системные include-файлы конечно же получаются от MSVC.
                                                                0
                                                                Свершилось: PVS-Studio для Linux.
                                                                +4
                                                                > Как именно устроен cl.exe я не знаю, но по косвенным уликам могу предположить, что имеется два совершенно разных алгоритма препроцессирования, используемых для компиляции и для создания*.i файлов.

                                                                По препроцессору Си могу сказать, что при использовании внешнего препроцессора и создании *.i файлов возможны проблемы с tokenizer. Встроенный препроцессор совмещают с tokenizer-ом и только тогда реализуют требования стандарта. Если вывод препроцессора сохранить в виде текста, повторное выделение токенов компилятором может дать иной результат.

                                                                Вот, например, у gcc «The compiler does not re-tokenize the preprocessor's output. Each preprocessing token becomes one compiler token.».

                                                                У clang встроенный препроцессор тоже выдает токены: «The preprocessor gives us a stream of tokens.»

                                                                Ваш пример с испорченным кодом — из этой серии. Комментарий после препроцессора должен был стать обычным пробельным токеном и наличие или отсутствие после него символа перевода строки не меняло бы значение последующих символов.
                                                                  +2
                                                                  Давно хотел узнать как соотносится PVS-Studio и статический анализатор на основе LLVM который разрабатывается Apple для XCode. Судя по тому что они проверяют clang этим анализатором при разработке получается что PVS-Studio все же лучше.
                                                                    +1
                                                                    Страшно, когда в компиляторе ошибки находятся?
                                                                    Я тут недавно gmcs уронил совершенно невинной конструкцией с наследованием шаблона, принимающего аргументом вложенный класс. Веселее всего было искать, что именно в коде на него так могло повлиять.
                                                                      0
                                                                      Собственно, в Clang анализатор нашёл только две ошибки. Из них одна на самом деле ошибкой не является. Всё остальное — ошибки LLVM, который, впрочем, тоже неплохо подходит для анализа, но ни в коем случае не является частью Clang (скорее наоборот).

                                                                      Об ошибках сообщил в несколько мест, часть уже исправили, остальное перенаправили авторам участков кода.

                                                                      По поводу PS: как так получается, что после препроцессирования у вас остаются комментарии? Моя версия из trunk старательно вырезает комментарии при процессировании (флаг -E) и нормально расставляет переносы. Вполне возможно, что баг уже давно исправлен.
                                                                        0
                                                                        нам нужны комментарии и мы просим их не вырезать. с комментариями баг есть.
                                                                        +2
                                                                        Оффтоп. Джон Кармак на QuakeCon 2011 рассказывает о статических анализаторах, в своей речи он упоминает PVS-Studio:
                                                                        http://www.youtube.com/watch?v=4zgYG-_ha28&feature=player_detailpage#t=54m00s
                                                                        0
                                                                        Вопорс топикстартеру: можно ли использовать пвс в автоматизированной билд системе? т.е не чтоб руками пускать и проверять каждый раз, а чтоб можно было проверять некоторое дерево автоматом из скрипта и получать некоторый с ошибками? Сильно глубоко я не копал, но внешне похоже что пвс заточен именно под ide и интерактивное использование?
                                                                          +1
                                                                          Можно. И из командной строки запускать, и проверять только файлы за последнюю неделю, а стартовать из систем сборки. В документации (внизу) все описано. Есть конкретные вопросы — пишите нам в поддержку.
                                                                          +1
                                                                          Небольшое продолжение — www.viva64.com/external-pictures/txt/LLVM.txt

                                                                          Only users with full accounts can post comments. Log in, please.