PVS-Studio: анализируем код Doom 3

    Doom 3 and PVS-Studio
    Компания id Software имеет лицензию на PVS-Studio. Тем не менее, мы решили проверить исходные коды Doom 3, которые недавно были выложены в сеть. Результат — ошибок найдено мало, но всё-таки найдено. Я предполагаю, что это можно объяснить так.

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

    Для тех, кто интересуется данной тематикой, предлагаю вниманию фрагменты кода, на которые указал анализатор PVS-Studio. Как всегда напоминаю, что рассматриваю только некоторые предупреждения. Другие участки проекта требуют знания структуры программы, и я их не изучал.



    Исходный код Doom 3 опубликован на GitHub и на официальном FTP компании под лицензией GPL v3. Для анализа я использовал инструмент PVS-Studio 4.39. Кряки для программы прошу не искать. Я уже встречал трояны, замаскированные под ключи и кряки к PVS-Studio. Лучше напишите нам, и мы дадим пробный ключ на некоторое время.

    Фрагмент 1. Подозрительное условие.


    #define BIT( num ) ( 1 << ( num ) )
    const int BUTTON_ATTACK = BIT(0);
    void idTarget_WaitForButton::Think( void ) {
      ...
      if ( player &&
          ( !player->oldButtons & BUTTON_ATTACK ) &&
          ( player->usercmd.buttons & BUTTON_ATTACK ) ) {
      ...
    }

    Диагностическое сообщение PVS-Studio: V564 The '&' operator is applied to bool type value. You've probably forgotten to include parentheses or intended to use the '&&' operator. Game target.cpp 257

    Обратите внимание на фрагмент "!player->oldButtons & BUTTON_ATTACK". Здесь хотели проверить, что самый младший бит равен 0. Но приоритет оператора '!' выше, чем оператора '&'. Это значит, что условие работает следующим образом:
    (!player->oldButtons) & 1

    Получается, что условие истинно, только если все биты равны нулю. Корректный вариант кода:
    if ( player &&
        ( ! ( player->oldButtons & BUTTON_ATTACK ) ) &&
        ( player->usercmd.buttons & BUTTON_ATTACK ) ) {

    Фрагмент 2. Подозрительный цикл.


    void idSurface_Polytope::FromPlanes(...)
    {
      ...
      for ( j = 0; j < w.GetNumPoints(); j++ ) {
        for ( k = 0; k < verts.Num(); j++ ) {
          if ( verts[k].xyz.Compare(w[j].ToVec3(),
                                    POLYTOPE_VERTEX_EPSILON ) ) {
            break;
          }
        }
        ...
      }
      ...
    }

    Диагностическое сообщение PVS-Studio: V533 It is likely that a wrong variable is being incremented inside the 'for' operator. Consider reviewing 'j'. idLib surface_polytope.cpp 65

    Вложенный цикл увеличивает переменную 'j', а не 'k'. Переменная 'k' вообще не увеличивается. Последствия работы такого цикла непредсказуемы. Корректный вариант кода:
    for ( k = 0; k < verts.Num(); k++ ) {

    Фрагмент 3. Другой подозрительный цикл.


    bool idMatX::IsOrthonormal( const float epsilon ) const {
      ...
      for ( int i = 0; i < numRows; i++ ) {
        ...
        for ( i = 1; i < numRows; i++ ) {
          ...
        }
        if ( idMath::Fabs( sum ) > epsilon ) {
          return false;
        }
      }
      return true;
    }

    Диагностическое сообщение PVS-Studio: V535 The variable 'i' is being used for this loop and for the outer loop. idLib matrix.cpp 3128

    Вложенный цикл организован с помощью той же переменной, что и внешний цикл. Оба цикла имеют условие остановки: i < numRows. Получается, что внешний цикл всегда выполняет только одну итерацию. Для исправления кода, можно использовать другую переменную во внутреннем цикле.

    Фрагмент 4. Неопределенное поведение.


    int idFileSystemLocal::ListOSFiles(...)
    {
      ...
      dir_cache_index = (++dir_cache_index) % MAX_CACHED_DIRS;
      ...
    }

    Диагностическое сообщение PVS-Studio: V567 Undefined behavior. The 'dir_cache_index' variable is modified while being used twice between sequence points. TypeInfo filesystem.cpp 1877

    Переменная «dir_cache_index» изменяется дважды в одной точке следования. То, что используется префиксный инкремент, не имеет значение. Компилятор теоретически вправе создать код следующего вида:
    A = dir_cache_index;
    A = A + 1;
    B = A % MAX_CACHED_DIRS;
    dir_cache_index = B;
    dir_cache_index = A;

    Конечно, скорее всего, выражение вычисляется правильно. Но уверенным в этом быть нельзя. На результат может влиять тип и версия компилятора, настройки оптимизации. Корректный вариант кода:
    dir_cache_index = (dir_cache_index + 1) % MAX_CACHED_DIRS;

    Фрагмент 5. Подозрительная очистка массива.


    void idMegaTexture::GenerateMegaMipMaps() {
      ...
      byte *newBlock = (byte *)_alloca( tileSize );
      ...
      memset( newBlock, 0, sizeof( newBlock ) );
      ...
    }

    Диагностическое сообщение PVS-Studio: V579 The memset function receives the pointer and its size as arguments. It is possibly a mistake. Inspect the third argument. DoomDLL megatexture.cpp 542

    Нулями заполняется только часть массива 'newBlock'. По всей видимости, это неправильно. Как мне кажется, раньше было написано так:
    byte newBlock[ CONST_ARRAY_SIZE ];
    ...
    memset( newBlock, 0, sizeof( newBlock ) );

    Потом требования изменились и размер массива 'newBlock' стал изменяться. Но про функцию его очистки забыли. Корректный вариант кода:
    memset( newBlock, 0, tileSize );

    Фрагмент 6. Еще одна подозрительная очистка массива.


    void Sys_GetCurrentMemoryStatus( sysMemoryStats_t &stats ) {
      ...
      memset( &statex, sizeof( statex ), 0 );
      ...
    }

    Диагностическое сообщение PVS-Studio: V575 The 'memset' function processes '0' elements. Inspect the third argument. DoomDLL win_shared.cpp 177

    Здесь при вызове функции 'memset' перепутаны аргументы. Функция очищает 0 байт. Это кстати весьма распространенная ошибка. Я встречал её многократно в разных проектах.

    Корректный вызов функции:
    memset( &statex, 0, sizeof( statex ) );

    Фрагмент 7. Здравствуй, Copy-Paste.


    void idAASFileLocal::DeleteClusters( void ) {
      ...
      memset( &portal, 0, sizeof( portal ) );
      portals.Append( portal );
    
      memset( &cluster, 0, sizeof( portal ) );
      clusters.Append( cluster );
    }

    Диагностическое сообщение PVS-Studio: V512 A call of the 'memset' function will lead to underflow of the buffer '& cluster'. DoomDLL aasfile.cpp 1312

    Обратите внимания, как похожи две верхние и две нижние строчки кода. Скорее всего, две последних строки были написаны с использованием технологии Copy-Paste. Это и привело к ошибке. В одном месте забыли заменить слово 'portal' на слово 'cluster'. В результате очищается только часть структуры. Корректный вариант кода:
    memset( &cluster, 0, sizeof( cluster ) );

    Я видел в коде и другие «недоочищенные» массивы, но про них писать не интересно.

    Фрагмент 8. Подозрительная работа с указателем.


    void idBrushBSP::FloodThroughPortals_r(idBrushBSPNode *node, ...)
    {
      ...
      if ( node->occupied ) {
        common->Error( "FloodThroughPortals_r: node already occupied\n" );
      }
      if ( !node ) {
        common->Error( "FloodThroughPortals_r: NULL node\n" );
      }
      ...
    }

    Диагностическое сообщение PVS-Studio: V595 The 'node' pointer was utilized before it was verified against nullptr. Check lines: 1421, 1424. DoomDLL brushbsp.cpp 1421

    Сначала указатель 'node' разименовывается: node->occupied. А затем, вдруг проверяется, не равен ли он NULL. Это очень подозрительный код. Я не знаю, как его сделать правильным, так как не знаю логику работы функции. Возможно, достаточно написать так:
    if ( node && node->occupied ) {

    Фрагмент 9. Подозрительный формат строки.


    struct gameVersion_s {
      gameVersion_s( void )
      {
        sprintf(string, "%s.%d%s %s %s",
                ENGINE_VERSION, BUILD_NUMBER, BUILD_DEBUG,
                BUILD_STRING, __DATE__, __TIME__ );
      }
      char string[256];
    } gameVersion;

    Диагностическое сообщение PVS-Studio: V576 Incorrect format. A different number of actual arguments is expected while calling 'sprintf' function. Expected: 7. Present: 8. Game syscvar.cpp 54

    Подозрительно то, что аргумент '__TIME__' никак не используется.

    Фрагмент 10. Код, который сбивает с толку.


    Неоднократно встречается код, который как я понимаю, работает правильно, но выглядит странно. Приведу только один пример такого кода.
    static bool R_ClipLineToLight(..., const idPlane frustum[4], ...)
    {
      ...
      for ( j = 0 ; j < 6 ; j++ ) {
        d1 = frustum[j].Distance( p1 );
        d2 = frustum[j].Distance( p2 );
        ...
      }
      ...
    }

    Для подсказки, программист написал, что массив 'frustum' состоит из 4 элементов. Но обрабатывается 6 элементов. Если посмотреть вызов 'R_ClipLineToLight', то там массив из 6 элементов. То есть всё должно работать правильно, но код заставляет задуматься.

    Другие ошибки и недочеты, можно увидеть, запустив анализатор PVS-Studio. Кстати, пользуясь, случаем хочу передать привет Джону Кармаку и сообщить ему, что мы скоро исправим недочет, который не позволяет в полную силу использовать PVS-Studio в компании id Software.

    Этим недочетом является низкая скорость работы анализатора. Учитывая большой объем исходного кода, с которым работает компания, это существенное ограничение. В PVS-Studio версии 4.50, которая выйдет в этом году, можно будет в качестве препроцессора использовать Clang, а не препроцессор от Visual C++. Это позволит существенно ускорить проверку проектов. Например, при использовании препроцессора от Visual C++ исходные коды Doom 3 проверяются за 26 минут. А при использовании препроцессора от Clang — за 16 минут. Пример, правда, получился не очень удачный. На большинстве проектах выигрыш по скорости анализа будет значительно сильнее.

    Правда по умолчанию, пока придется использовать препроцессор от Visual C++. У Clang все еще есть некоторые несовместимости и недоделки, касающиеся Windows-платформы. Так что успешно удаётся проверить только 80% проектов.
    PVS-Studio
    Static Code Analysis for C, C++, C# and Java

    Comments 110

      +11
      Там в коде не найдена строчка «Русские не сдаются»?
      • UFO just landed and posted this here
          +12
          сомневаюсь, что тут именно копипаст, больше похоже на опечатку
            –1
            Копипастить простые циклы это конечно ок идея…
            Хотя с другой стороны вижу что ограничитель (w.GetNumPoints()) не вынесен в переменную дабы не вызывался метод каждую итерацию, так что всё может быть :)
              0
              вы также не видите, меняется это значение внутри цикла или нет. Все может быть :)
                0
                Скорей всего метод заинлайнен и нет смысла выводить в отдельную переменную.
                  +1
                  Далеко не факт, я очень часто наталкиваюсь на такой оптимизационный «ляп».
                  В данном случае оптимизация крайне проста и не уменьшает читабельность кода, поэтому лучше сразу писать правильно, имхо.
                0
                Отладка кода делиться на две фазы:

                Первая: Почему оно не работает.
                Вторая: Как оно вообще может работать. (o_0)
                +6
                Жду исправленный Doom3 с блекджеком :)
                  –3
                  а разве дум3 без них бывал?
                  эти монстры это моральный облик части окружающих нас людей…
                  нам показали какэто выглядит… жаль не все увидели… хотя страху натерпелись :+))
                  +9
                  Интересно, что они не исправили недочеты, хотя пользуются PVS-Studio.
                    0
                    Как я написал в статье, скорее всего это связано с тем, что часть кода не используется.
                      +1
                      Как это?
                      Запускают анализатор для Doom4, находит старые баги, они лезут их исправлять и в Doom3?
                      Имхо, маловероятно.
                      +5
                      Кто сказал что они пользуются PVS-Studio? Они может просто купили лицензию, поиграли и забросили. Или используют в других своих проектах.
                      –2
                      Так Дум3 вышел ещё когда PVS-Studio ещё в помине не было вроде как.
                      +2
                      Пулл реквест то послали?
                        –20
                        А зачем?
                          +24
                          Меня вопрос аж в тупик поставил. Как это зачем?

                          Нашли ошибки в коде, который, скорее всего, будет очень востребован в ближайшем будущем. Кто-то возможно потратит кучу времени и сил, когда с ними столкнется. А вам вот прямо сейчас ничего не стоит их исправить. Да просто ради уменьшения энтропии вселенной хотя бы.
                            –18
                            А почему, тем кто «возможно потратит кучу времени» должен быть я? :) Вот давайте я дам вам ключ от PVS-Studio и Вы поможете миру стать лучше. Жду Вас в почте за ключиком: karpov[@]viva64.com. Если Вы мне не напишите и не начнете этим заниматься, то Ваши слова ничего не стоят и не значат.
                              +39
                              Мне не нужен ключ, я на С++ вообще не пишу. А вы уже потратили это время и уже нашли ошибки. И вам вот именно сейчас ничего не стоит сделать мир лучше просто нажав кнопку на гитхабе. Этим самым вы сэкономите миллион человекочасов многим людям и сделаете их жизнь лучше.

                              Хотя, действительно, а зчем? Похуй, пускай так будет.
                                +11
                                Вот о чём я и говорю. Просто проходили мимо и решили поучить окружающих жизни.

                                Я всегда отписываю про найденные ошибки разработчиков. Но мне уже надоели доброхоты, рассказывающие как мне надо поступать. Я специально теперь предлагаю им самим сделать добро. И они всегда отказываются. То он Visual Studio не использует… То на Си++ не программирует… И Вы в том числе. Очень забавно наблюдать.
                                  +62
                                  Ебанные уши, я вообще веб-программист и пишу на руби. Visual Studio я в жизни не запускал ни разу и слабо себе представляю, что это вообще такое. Виндой тоже не пользуюсь лет этак 6. И да, я отправил много пулл-реквестов во всякие разные опен-сорц библиотеки с исправлениями. Какая это вообще имеет значение?

                                  Мы сейчас разговариваем о конкретной ситуации, когда нашли ошибки, но пулл-реквест отправить — «а зачем?». Что-то это фигово вяжется с фразой про «всегда отписываю про найденные ошибки разработчикам».
                                    –2
                                    Ну правильно. Давайте минусовать меня злодея, и плюсовать праведников. :) Жду в почте голосующих идеалистов. Кто займётся исправлением ошибок в Doom — тому дам ключ. Посмотрим, сколько будет желающих.
                                      +16
                                      Основная мысль в том, что вы уже нашли и исправили (хотя бы «на словах») несколько багов.
                                      И вас отделяет от полезного вклада только один короткий шаг — сделать пул-реквест.
                                        +5
                                        пулл реквест кому?
                                        github.com/TTimo/doom3.gpl/issues/1
                                        Q> How do you manage pull requests in this repository? Will you merge any quality branches into the codebase?
                                        A> I don't expect to be merging much things at all. Things like supporting XCode 4 and newer OSX maybe, or simple bug fixes. Some of the forked repositories might turn out to be pretty active, I expect the ioquake3 folks (#ioquake3 on freenode) will be pretty active for a while.
                                          +4
                                          TTimo предлагал www.iodoom3.org/ сюда отправлять пулл реквесты.
                                            –2
                                            Iсполняющий Oбязанности Дум 3. Однако.
                                            +1
                                            Кошмар! В репозиториях творится полнейший ад. Каждый наровит конвертнуть исходники в свой любимы code style! Проекту нужен лидер.
                                              0
                                              or simple bug fixes
                                              +3
                                              Ну да, тут ошибка есть, а в другом месте она закостылена, и после исправления тут «сломается ВСЁ» нельзя просто взять и что то исправить в коде без проверки ;)

                                              Я конечно утрирую, но с разбегу ковырять абсолютно незнакомый проект, а уж тем более искать ошибки сам тоже не стану, да и никому не советую, поскольку есть шанс сделать ещё хуже.
                                              +4
                                              При наличии данной статьи, исправление ошибок будет невероятно сложным :)
                                                +2
                                                Это большая работа. Вы не учитываете, что здесь перечислены далеко не все подозрительные места.
                                                  +1
                                                  А зачем править _все_ места?
                                                  Никто не требует от вас полноценного code-review и исправления всех багов, просто правка тех мест, которые вы заметили и описали в статье.
                                                    +7
                                                    Да вы вообще не вправе от него что-то требовать, если честно. Вы пуллреквестите, а он — пишет статьи, двигая свой продукт. Проходите мимо, а то начинаете навязывать свое мнение людям, которые своими делами и так вносят вклад в общее дело.
                                                +4
                                                Мне кажется, вам просто надо дополнить ваш анализатор функцией исправления ошибок и отправки патчей разработчикам, и проблема решится сама собой!
                                                  +8
                                                  Только после того, как в VS реализуют кнопку «Сделать мне хорошо».
                                                    0
                                                    Бррр, Я думал ее уже добавили :(
                                                  +6
                                                  Раз такое дело — давайте!
                                                  Готов прошерстить ошибки, выявленные PVS-Studio в коде Doom III.
                                                  Обещаю до Нового года отчитаться о сделанной работе (если, конечно, там не тысячи предупреждений).

                                                  Посылаю на почту это же сообщение.
                                                    +8
                                                    Хорошо. Вот уже сегодня нескольким человекам выдали ключ — кому для Doom, кому для своих собственных проектов.

                                                    P.S. Кто будет работать с Doom, просьба смотреть, прежде чем править. А то уже были случаи. Когда два добровольцы приходят в открытый проект и первый правит код, меняя аргументы:

                                                    memset( X, sizeof( X ), 0 );
                                                    заменяет на:
                                                    memset( X, 0, sizeof( X ) );

                                                    А второй, не глядя, тоже делает доброе дело и вновь меняет аргументы:

                                                    memset( X, 0, sizeof( X ) );
                                                    заменяет на:
                                                    memset( X, sizeof( X ), 0 );

                                                    Использование подсказок от статического анализатора не отменяет необходимость думать и разбираться в коде. :)

                                                      +2
                                                      еще cppcheck прогони, чисто посмотреть на разницу. он бесплатен.
                                                      0
                                                      Описал на почту. Чем просто ковырять исходники, лучше сразу полезным делом заниматься.
                                                      +40
                                                      Я вообще PVS-Studio не люблю, но в данном случае автора понимаю. Вы предлагаете ему сделать бесплатно на благо общества некий кусок работы (оформить пул-реквест, перевести данный топик, написать письмо). Это вполне себе время (а значит — деньги). С таким же успехом можно делать заявления типа «Ну ты же врач, умеешь лечить людей — пойди после основной работы волонтёром бездомных бесплатно полечи пару часов! Не хочешь? Ну ты козел!».
                                                      Почему Вы вообще требуете от человека выполнения какой-то работы бесплатно, просто на том основании, что он может и умеет её делать?
                                                        0
                                                        Да никто ничего не требует, в самом деле. Ну если лениво, то и ладно. Мне искренне не понятна позиция «а зачем?».

                                                        Это как сделать скворечник, а потом выкинуть его в помойку.
                                                          +8
                                                          Это скорее как достать досок, гвоздей и молоток. Прогнать код через статический анализатор — я не думаю что это занимает много времени. А вот оформить все это как баг репорт и сделать все необходимые действия чтобы он попал куда нужно — на это нужно время.
                                                            +1
                                                            Да. Самое сложное — трудно понять, ошибка это или так хитро задумано. В некоторых случаях на это уходит очень много времени, кто не знаком с проектом.
                                                              –1
                                                              Да, это серьезная и трудоёмкая работа. И вот вы ее проделали, получили плюсиков на хабре. Самое время теперь получить за ту же самую работу плюсиков на гитхабе!!1
                                                                +15
                                                                Ды..., не проделал я эту работу! Работа у меня другая. Она более для меня полезна. И думаю для окружающих в конечном итоге тоже. Это разработка статического анализатора и популяризация этой технологии. Я только пробежался по верхам и выписал те места, где ошибки более очевидны. Разбираться с каждым отдельным сообщением у меня нет сил и времени.

                                                                И не надо делать из меня злодея. Нас мало, а проектов в мире много. Вкладывать свое время в чужие проекты не имеет смысла. Это хорошо быть героем и внимательно поработав с 1-2 Open-Source проектами, исправить в них ошибки. А мы проверяем проекты десятками. Если мы начнем их внимательно смотреть и править чужие ошибки, то вся работа остановится.
                                                            +4
                                                            автор не просто потратил время на разбирание исходников, это реклама pvs-studio и я так понимаю она окупится; так что можно не волноваться за напрасно проведенную автором работу.
                                                          +7
                                                          >>Какая это вообще имеет значение?

                                                          Такое, что если вы за энтропию, экономию человекочасов и прочее построение коммунизма — возьмите и сделайте. Сами. А не рассказывайте кому и что нужно срочно сделать.
                                                            –12
                                                            Я не умею и мне жалко времени. А он умеет и это время уже потратил и все сделал. Теперь он результаты своей полезной работы берет и спускает в унитаз. Видимо, чтобы врагу не достались.
                                                            0
                                                            За уменьшение энропии, вы хотели сказать?
                                                            +5
                                                            ну вот и иди в жопу со своими учениями других
                                                              +8
                                                              ты не понял. цель поста — попиарить pvs studio, а не что либо поправить. Поэтому и отправлять никто ничего не будет, очевидно же. В прошлый раз правда за такой отклик мне влупили полгода r/o, так что считай реклама проплачена.
                                                  +1
                                                  Кто-нибудь может посоветовать такой же, но только с пурпуровыми пуговицами для java?
                                                    –2
                                                    Ну… Тяжело сравнивать, так как на С++ писал очень давно, а PVS вообще никогда не использовал, но свой код прогоняю через FindBug. Есть еще PMD check.
                                                      +1
                                                      например, в IntelliJ IDEA (даже в бесплатной community edition) есть богатый набор разнообразнейших инспекций для статического анализа кода
                                                      www.jetbrains.com/idea/
                                                        0
                                                        В Java очень большое число подобных грабель просто не может возникнуть.
                                                        Хотя, конечно, там есть и свои.
                                                          +3
                                                          Несомненно откопипастить 2 одинаковы строки и забыть поменять или ошибиться инкрементом в for-е невозможно, это все полохой с++.
                                                            +3
                                                            Не знаю, как там в Java (не пишу на ней), но в современных языках давно уже:
                                                            * В Python цикл for итерирует без счётчика — меньше писанины, копировать смысла нет.
                                                            * В D есть foreach, можно дописывать его поддержку в свои стурктуры/классы.
                                                            * В Racket вообще всего навалом — for, for-each, for/list, for/vector… Да ещё макросы, характерные для Lisp. Копипаста корчится в предсмертных судорогах.

                                                            И вот в 2011 году (!) наконец-то и в C++, в одном из самых популярных языков мира с туевой хучей написанного на нём софта, появилась поддержка циклов а-ля foreach. Нет, конечно, C++ тут совершенно не причём. И то, что стандарты принимаются по 10 лет, тоже мелочь. Обратная совместимость — вообще смешно.

                                                            Да C++ стимулирует копипасту всеми своими тентаклями и только недавно начал приходить в норму. Пока ещё компиляторы под него допилят, а для C++ это pain in the ass. Используют C++ просто из-за скорости кода (когда это критично) и ООПэшности, ну и по привычке.

                                                            И я это говорю не как нуб, я на C++ чего только не писал — парсеры и компиляторы, игры и всякие утилиты, разобрался во всех хитросплетениях кода Андрея Александреску и Джеффа Элджера. Но даже Андрей таки не выдержал, и забросил пляски вокруг шаблонов, свалив допиливать стандартную библиотеку D.
                                                          +1
                                                          помимо Idea можно посмотреть checkstyle и findbugs
                                                            0
                                                            PMD еще есть.
                                                          +5
                                                          Не думаю, что когда-либо буду использовать сей чудесный продукт, но чувство, что прикоснулся к прекрасному — не покидает.
                                                            –21
                                                            Всех с пятницей. Ваш К.О
                                                              +40
                                                              PVS-studio опубликовали под опенсорсом и вы решили написать об этом в блоке «Опен Сорс»?
                                                                +3
                                                                В PVS-Studio версии 4.50, которая выйдет в этом году, можно будет в качестве препроцессора использовать Clang, а не препроцессор от Visual C++
                                                                Так что, таки в скором времени появится версия для Linux/Mac?
                                                                  0
                                                                  Нет. Но это шаг…
                                                                    +1
                                                                    Ну алеллуйя))) Так можно перепилить его в качестве плагина для llvm+clang и все счастливы будут)
                                                                      0
                                                                      Перепелить можно все что угодно. Но написано было об использовании clang в качестве препроцессора.
                                                                      0
                                                                      Да. Вот она: PVS-Studio для Linux (всего 5 лет и надо было подождать :).
                                                                        0

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

                                                                          0
                                                                          Я и есть зло.
                                                                      0
                                                                      Было бы хорошо, если бы вы прогнали через PVS-студию проект с большим количеством шаблонов и классов. А также показали как ваш продукт можно заинтегрировать в сторонюю систему сборки, которая использует компилятор Microsoft Visual C++.
                                                                        0
                                                                        >> Было бы хорошо, если бы вы прогнали через PVS-студию проект с большим количеством шаблонов и классов.

                                                                        Называйте проект. Должен иметь солюшен для VS.

                                                                        >> А также показали как ваш продукт можно заинтегрировать в сторонюю систему сборки, которая использует компилятор Microsoft Visual C++.

                                                                        www.viva64.com/ru/d/0007/
                                                                          0
                                                                          > Называйте проект. Должен иметь солюшен для VS.

                                                                          Google Chromiium :)
                                                                              +2
                                                                              Эх, я теперь хочу чтобы вы посмотрели код Mozilla Firefox. Это же жутко интересно, действительно там всё так плохо как все думают говорят?
                                                                                +1
                                                                                Это сложнее, так как нет сборки под Visual Studio.
                                                                            +1
                                                                            Хромиум уже был, www.viva64.com/ru/a/0074/
                                                                            +1
                                                                            эм, Boost? :) или уже было?
                                                                              0
                                                                              Как я писал выше: «Должен иметь солюшен для VS.»
                                                                                +1
                                                                                а у буста нет? значит примите извинения :)
                                                                                  0
                                                                                  мб clanlib
                                                                                0
                                                                                aalib + bb
                                                                              +2
                                                                              например, в IntelliJ IDEA (даже в бесплатной community edition) есть богатый набор разнообразнейших инспекций для статического анализа кода
                                                                              www.jetbrains.com/idea/
                                                                                0
                                                                                Вы блогом ошиблись, тут речь про С++, а не Java.
                                                                                  +1
                                                                                  я ошибся местом вставки комментария :) Это я отвечал на: «Кто-нибудь может посоветовать такой же, но только с пурпуровыми пуговицами для java?»

                                                                                    0
                                                                                    Ох, а я пропустил ту ветку и не увидел аналогичный комментарий :)
                                                                                0
                                                                                Чёрт. Я тогда вообще не понимаю, как этот Doom тогда в состоянии работать. Или это всё в мёртвых неработающих ветках?
                                                                                А ведь там, насколько помнится, часть кода написана ещё и на некоем внутреннем скриптовом языке. Его так вообще не проверить, из-за динамики.
                                                                                  +2
                                                                                  Здесь скорее дело в везении. В большинстве, это мины, которые просто спят и ждут своего часа. Они проявят себя при смене компилятора/настроек. Или после рефакторинга. Меняем в одном месте — глючит в другом (компилятор что-то начал иначе оптимизировать).
                                                                                  Фрагмент 4. Пока компилятор вначале увеличивает dir_cache_index всё хорошо.
                                                                                  Фрагмент 5-7. Если в недоочищенной памяти содержатся нули, то и всё хорошо (пока).
                                                                                  И так далее.
                                                                                  +2
                                                                                  Зачем в статье линкеры сайта PVS студии?
                                                                                  0
                                                                                  Фрагмент 3, скорее всего, какой-то хитрый код нежели баг.
                                                                                    0
                                                                                    Несколько вопросов:
                                                                                    1. PVS не планирует реализовать поиск неиспользуемого кода?
                                                                                    2. Как насчет рекомендаций по оптимизации кода? (или рефакторинг под определенную версию языка, например С++11)
                                                                                    3. Как идет работа по ускорению PVS, может представить критические участки кода в виде задач для програмистов и выложить на Хабре — решивший наиболее оптимально получает версию PVS.
                                                                                      +1
                                                                                      1. Неиспользуемый код хорошо находится компиляторам. По крайней мере, в Visual C++. Реализовывать функциональность, которая есть в Visual C++, мы сейчас поводов не видим.

                                                                                      2. У нас есть задел в этом направлении (диагностики V801-V806). Но развивается он медленно. Интересней находить ошибки, чем места для микрооптимизаций. С рекомендациями по поводу рефакторинга не понятно. Прошу привести примеры.

                                                                                      3. В коде нет каких то особенно узких мест. Мы время от времени посматриваем профайлером. Последним по настоящим узким местом было использование vector и string. Вернее то, что они не очень удачно работали с памятью. Мы имеем некоторую высокоуровневую информацию, которая позволяет создавать и уничтожать массивы/строки более экономно. Теперь в ряде критических мест используются свои строи и массивы.
                                                                                      В основном сейчас скорость упирается во внешний препроцессор. Visual C++ при препроцессировании работает дольше, чем потом PVS-Studio анализирует полученный i-файл. Поэтому сейчас оптимизировать что-то в PVS-Studio глупо, раз больше половины времени работает не он, а cl.exe. Вот когда перейдем на Clang, тогда можно будет смотреть внимательнее. Сейчас это не то место. :)
                                                                                        0
                                                                                        2. делегирование конструкторов и универсальная инициализация, auto, nullptr, smart pointers, wrapper references — это наверное основное. А вообще интересен хотя бы полуавтоматический перевод старых проектов на C++11, тут как раз без проверки ошибок не обойтись.
                                                                                          0
                                                                                          «Использовать конструкции C++11» — это слишком абстрактно. Хочется более конкретные рекомендации с примерами. Для каких конструкций что советовать. Если удобнее, можем пообщаться в почте.
                                                                                      +17
                                                                                      Кстати, многие из этих ошибок мне нашёл сам Clang с опциями -Wall -pedantic
                                                                                        +3
                                                                                        Вот это я называю грамотной рекламой. И продукт описали, и читать интересно.

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