Для получения триального ключа
заполните форму ниже
Team License (базовая версия)
Enterprise License (расширенная версия)
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
GBP
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
>
Как настроить PVS-Studio в Travis CI на…

Как настроить PVS-Studio в Travis CI на примере эмулятора игровой приставки PSP

22 Авг 2019

Travis CI - распределённый веб-сервис для сборки и тестирования программного обеспечения, использующий GitHub в качестве хостинга исходного кода. Помимо указанных выше сценариев работы, можно добавить собственные, благодаря обширным возможностям для конфигурации. В данной статье мы настроим Travis CI для работы с PVS-Studio на примере кода PPSSPP.

0661_PPSSPP_TravisCI_ru/image1.png

Введение

Travis CI - это веб-сервис для сборки и тестирования программного обеспечения. Обычно его используют совместно с практикой непрерывной интеграции.

PPSSPP - эмулятор игровой приставки PSP. Программа в состоянии эмулировать запуск любых игр с образов дисков, предназначенных для Sony PSP. Выпуск программы состоялся 1 ноября 2012 года. PPSSPP распространяется по лицензии GPL v2. Любой желающий может внести свои улучшения в исходный код проекта.

PVS-Studio - статический анализатор кода для поиска ошибок и потенциальных уязвимостей в коде программ. В этой статье мы для разнообразия запустим PVS-Studio не локально на машине разработчика, а в облаке, и поищем ошибки в PPSSPP.

Настройка Travis CI

Нам понадобится репозиторий на GitHub, где лежит нужный нам проект, а так же ключ для PVS-Studio (можете получить триальный ключ или бесплатный для Open Source проектов).

Перейдем на сайт Travis CI. После авторизации при помощи аккаунта GitHub перед нами будет список репозиториев:

0661_PPSSPP_TravisCI_ru/image2.png

Для теста я сделал форк PPSSPP.

Активируем репозиторий, который хотим собирать:

0661_PPSSPP_TravisCI_ru/image3.png

На данный момент Travis CI не может собрать наш проект, так как нет инструкций для сборки. Поэтому настало время для конфигурации.

Во время анализа нам пригодятся некоторые переменные, например, ключ для PVS-Studio, которые было бы нежелательно указывать в файле конфигурации. Так что добавим переменные окружения при помощи настройки сборки в Travis CI:

0661_PPSSPP_TravisCI_ru/image4.png

Нам понадобятся:

  • PVS_USERNAME - имя пользователя
  • PVS_KEY - ключ
  • MAIL_USER - email, который будет использован для отправки отчета
  • MAIL_PASSWORD - пароль от email

Последние две необязательны. Они будут использоваться для отправки результатов по почте. Если вы хотите разослать отчет другим способом, то не нужно их указывать.

Итак, мы добавили нужные нам переменные окружения:

0661_PPSSPP_TravisCI_ru/image5.png

Теперь создадим файл .travis.yml и поместим его в корень проекта. В PPSSPP уже существовал файл конфигурации для Travis CI, однако, он был слишком большой и совершенно не подходил для примера, поэтому пришлось значительно его упростить и оставить только основные элементы.

Сперва укажем язык, версию Ubuntu Linux, которую мы хотим использовать в виртуальной машине, и необходимые пакеты для сборки:

language: cpp
dist: xenial

addons:
  apt:
    update: true
    packages:
      - ant
      - aria2
      - build-essential
      - cmake
      - libgl1-mesa-dev
      - libglu1-mesa-dev
      - libsdl2-dev
      - pv
      - sendemail
      - software-properties-common
    sources:
      - sourceline: 'ppa:ubuntu-toolchain-r/test'
      - sourceline: 'ppa:ubuntu-sdk-team/ppa'

Все пакеты, которые указаны, нужны исключительно для PPSSPP.

Теперь укажем матрицу сборок:

matrix:
  include:
    - os: linux
      compiler: "gcc"
      env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
    - os: linux
      compiler: "clang"
      env: PPSSPP_BUILD_TYPE=Linux

Немного подробнее про секцию matrix. В Travis CI существует два способа для создания вариантов сборки: первый - указать списком компиляторы, типы операционных систем, переменные окружения и т.д, после чего сгенерируется матрица всех возможных комбинаций; второй - явное указание матрицы. Разумеется, можно комбинировать эти два подхода и добавить уникальный случай, или же, напротив, исключить при помощи секции exclude. Подробнее об этом можно почитать в документации по Travis CI.

Осталось указать специфичные для проекта инструкции по сборке:

before_install:
  - travis_retry bash .travis.sh travis_before_install

install:
  - travis_retry bash .travis.sh travis_install

script:
  - bash .travis.sh travis_script

after_success:
  - bash .travis.sh travis_after_success

Travis CI позволяет добавить свои команды для различных этапов жизни виртуальной машины. Секция before_install выполняется перед установкой пакетов. Затем install, которая следует за установкой пакетов из списка addons.apt, который мы указали выше. Сама сборка происходит в script. Если все прошло успешно, то мы попадаем в after_success (именно в этой секции мы и будем запускать статический анализ). Это не все этапы, которые можно модифицировать, если нужно больше, то стоит поискать в документации по Travis CI.

Для удобства чтения команды были вынесены в отдельный скрипт .travis.sh, который помещен в корень проекта.

Итак, мы имеем следующий файл .travis.yml:

language: cpp
dist: xenial

addons:
  apt:
    update: true
    packages:
      - ant
      - aria2
      - build-essential
      - cmake
      - libgl1-mesa-dev
      - libglu1-mesa-dev
      - libsdl2-dev
      - pv
      - sendemail
      - software-properties-common
    sources:
      - sourceline: 'ppa:ubuntu-toolchain-r/test'
      - sourceline: 'ppa:ubuntu-sdk-team/ppa'

matrix:
  include:
    - os: linux
      compiler: "gcc"
      env: PVS_ANALYZE=Yes
    - os: linux
      compiler: "clang"

before_install:
  - travis_retry bash .travis.sh travis_before_install

install:
  - travis_retry bash .travis.sh travis_install

script:
  - bash .travis.sh travis_script

after_success:
  - bash .travis.sh travis_after_success

Перед установкой пакетов обновим подмодули. Это нужно для сборки PPSSPP. Добавим первую функцию в .travis.sh (обратите внимание на расширение):

travis_before_install() {
  git submodule update --init --recursive
}

Теперь мы подошли непосредственно к настройке автоматического запуска PVS-Studio в Travis CI. Сперва нам нужно установить пакет PVS-Studio в систему:

travis_install() {
  if [ "$CXX" = "g++" ]; then
    sudo apt-get install -qq g++-4.8
  fi
  
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    wget -q -O - https://files.viva64.com/etc/pubkey.txt \
      | sudo apt-key add -
    sudo wget -O /etc/apt/sources.list.d/viva64.list \
      https://files.viva64.com/etc/viva64.list  
    
    sudo apt-get update -qq
    sudo apt-get install -qq pvs-studio \
                             libio-socket-ssl-perl \
                             libnet-ssleay-perl
  fi
    
  download_extract \
    "https://cmake.org/files/v3.6/cmake-3.6.2-Linux-x86_64.tar.gz" \
    cmake-3.6.2-Linux-x86_64.tar.gz
}

В начале функции travis_install мы устанавливаем необходимые нам компиляторы, используя переменные окружения. Затем, если переменная $PVS_ANALYZE хранит значение Yes (мы указали его в секции env во время конфигурации матрицы сборок), мы устанавливаем пакет pvs-studio. Кроме него ещё указаны пакеты libio-socket-ssl-perl и libnet-ssleay-perl, однако, они нужны для отправки результатов по почте, поэтому в них нет необходимости, если вы выбрали другой способ доставки отчета.

Функция download_extract скачивает и распаковывает указанный архив:

download_extract() {
  aria2c -x 16 $1 -o $2
  tar -xf $2
}

Настало время собрать проект. Это происходит в секции script:

travis_script() {
  if [ -d cmake-3.6.2-Linux-x86_64 ]; then
    export PATH=$(pwd)/cmake-3.6.2-Linux-x86_64/bin:$PATH
  fi
  
  CMAKE_ARGS="-DHEADLESS=ON ${CMAKE_ARGS}"
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  fi
  cmake $CMAKE_ARGS CMakeLists.txt
  make
}

Фактически, это упрощенная оригинальная конфигурация, за исключением этих строк:

if [ "$PVS_ANALYZE" = "Yes" ]; then
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi

В этом участке кода мы устанавливаем для cmake флаг экспорта команд компиляции. Это необходимо для статического анализатора кода. Подробнее об этом можно почитать в статье "Как запустить PVS-Studio в Linux и macOS".

Если сборка прошла успешно, то мы попадаем в after_success, где выполним статический анализ:

travis_after_success() {
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
    pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic \
                                    -o PVS-Studio-${CC}.log \
                                    --disableLicenseExpirationCheck
    
    plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html
    sendemail -t mail@domain.com \
              -u "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" \
              -m "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" \
              -s smtp.gmail.com:587 \
              -xu $MAIL_USER \
              -xp $MAIL_PASSWORD \
              -o tls=yes \
              -f $MAIL_USER \
              -a PVS-Studio-${CC}.log PVS-Studio-${CC}.html
  fi
}

Рассмотрим подробнее следующие строки:

pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic \
                                -o PVS-Studio-${CC}.log \
                                --disableLicenseExpirationCheck
plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html

Первая строка генерирует файл лицензии из имени пользователя и ключа, который мы указали в самом начале во время настройки переменных окружения Travis CI.

Вторая строка запускает непосредственно анализ. Флаг -j<N> устанавливает кол-во потоков для анализа, флаг -l <file> указывает лицензию, флаг -o <file> определяет файл для вывода логов, а флаг -disableLicenseExpirationCheck необходим для триальных версий, так как по умолчанию pvs-studio-analyzer предупредит пользователя о скором истечении лицензии. Чтобы этого не было - можно указать этот флаг.

Файл логов содержит необработанный вывод, который не получится прочитать без конвертирования, поэтому сперва необходимо сделать файл читабельным. Пропустим логи через plog-converter, и на выходе получаем html файл.

В данном примере я решил отправить отчеты по почте, использовав команду sendemail.

В итоге у нас получился следующий файл .travis.sh:

#/bin/bash

travis_before_install() {
  git submodule update --init --recursive
}

download_extract() {
  aria2c -x 16 $1 -o $2
  tar -xf $2
}

travis_install() {
  if [ "$CXX" = "g++" ]; then
    sudo apt-get install -qq g++-4.8
  fi
  
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    wget -q -O - https://files.viva64.com/etc/pubkey.txt \
      | sudo apt-key add -
    sudo wget -O /etc/apt/sources.list.d/viva64.list \
      https://files.viva64.com/etc/viva64.list  
    
    sudo apt-get update -qq
    sudo apt-get install -qq pvs-studio \
                             libio-socket-ssl-perl \
                             libnet-ssleay-perl
  fi
    
  download_extract \
    "https://cmake.org/files/v3.6/cmake-3.6.2-Linux-x86_64.tar.gz" \
    cmake-3.6.2-Linux-x86_64.tar.gz
}
travis_script() {
  if [ -d cmake-3.6.2-Linux-x86_64 ]; then
    export PATH=$(pwd)/cmake-3.6.2-Linux-x86_64/bin:$PATH
  fi
  
  CMAKE_ARGS="-DHEADLESS=ON ${CMAKE_ARGS}"
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  fi
  cmake $CMAKE_ARGS CMakeLists.txt
  make
}
travis_after_success() {
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
    pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic \
                                    -o PVS-Studio-${CC}.log \
                                    --disableLicenseExpirationCheck
    
    plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html
    sendemail -t mail@domain.com \
              -u "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" \
              -m "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" \
              -s smtp.gmail.com:587 \
              -xu $MAIL_USER \
              -xp $MAIL_PASSWORD \
              -o tls=yes \
              -f $MAIL_USER \
              -a PVS-Studio-${CC}.log PVS-Studio-${CC}.html
  fi
}
set -e
set -x

$1;

Настало время добавить изменения на git-репозиторий, после чего Travis CI автоматически запустит сборку. Кликнем на "ppsspp", чтобы перейти к отчетам по сборке:

0661_PPSSPP_TravisCI_ru/image6.png

Перед нами появится обзор текущей сборки:

0661_PPSSPP_TravisCI_ru/image7.png

В случае успешного завершения сборки мы получим на почту письмо с результатами статического анализа. Разумеется, отправка по почте - не единственный способ получить отчет. Вы можете выбрать любой способ реализации. Но важно помнить, что после завершения сборки будет невозможно получить доступ к файлам виртуальной машины.

Краткий обзор ошибок

Самую сложную часть мы успешно завершили. Теперь давайте убедимся, что все наши усилия оправдались. Рассмотрим некоторые интересные моменты из отчета по статическому анализу, которые пришли мне по почте (не зря же я указал её).

Опасная оптимизация

void sha1( unsigned char *input, int ilen, unsigned char output[20] )
{
  sha1_context ctx;

  sha1_starts( &ctx );
  sha1_update( &ctx, input, ilen );
  sha1_finish( &ctx, output );

  memset( &ctx, 0, sizeof( sha1_context ) );
}

Предупреждение PVS-Studio: V597 The compiler could delete the 'memset' function call, which is used to flush 'sum' buffer. The RtlSecureZeroMemory() function should be used to erase the private data. sha1.cpp 325

Данный фрагмент кода находится в модуле безопасного хеширования, однако, в нём кроется серьезный дефект безопасности (CWE-14). Рассмотрим ассемблерный листинг, который генерируется при компиляции Debug-версии:

; Line 355
  mov r8d, 20
  xor edx, edx
  lea rcx, QWORD PTR sum$[rsp]
  call memset
; Line 356

Все в полном порядке, и функция memset выполняется, тем самым затирая важные данные в оперативной памяти, однако, не стоит пока радоваться. Рассмотрим ассемблерный листинг Release-версии с оптимизацией:

; 354  :
; 355  :  memset( sum, 0, sizeof( sum ) );
; 356  :}

Как видно из листинга, компилятор проигнорировал вызов memset. Это связано с тем, что в функции sha1 после вызова memset больше нет обращения к структуре ctx. Поэтому компилятор не видит смысла тратить процессорное время на перезапись неиспользуемой в дальнейшем памяти. Можно исправить это, воспользовавшись функцией RtlSecureZeroMemory или аналогичной ей.

Правильно:

void sha1( unsigned char *input, int ilen, unsigned char output[20] )
{
  sha1_context ctx;

  sha1_starts( &ctx );
  sha1_update( &ctx, input, ilen );
  sha1_finish( &ctx, output );

  RtlSecureZeroMemory(&ctx, sizeof( sha1_context ) );
}

Лишнее сравнение

static u32 sceAudioOutputPannedBlocking
             (u32 chan, int leftvol, int rightvol, u32 samplePtr) {
  int result = 0;
  // For some reason, this is the only one that checks for negative.
  if (leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0) {
    ....
  } else {
    if (leftvol >= 0) {
      chans[chan].leftVolume = leftvol;
    }
    if (rightvol >= 0) {
      chans[chan].rightVolume = rightvol;
    }
    chans[chan].sampleAddress = samplePtr;
    result = __AudioEnqueue(chans[chan], chan, true);
  }
}

Предупреждение PVS-Studio: V547 Expression 'leftvol >= 0' is always true. sceAudio.cpp 120

Обратите внимание на else-ветку для первого if. Код будет выполнен только в том случае, если все условия leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0 окажутся ложными. Следовательно, мы получаем следующие утверждения, которые будут истинны для else-ветки: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol >= 0 и rightvol >= 0. Обратите внимание на последние два утверждения. Разве имеет смысл проверять то, что является необходимым условием выполнения этого фрагмента кода?

Так что мы можем со спокойной душой удалить эти условные операторы:

static u32 sceAudioOutputPannedBlocking
(u32 chan, int leftvol, int rightvol, u32 samplePtr) {
  int result = 0;
  // For some reason, this is the only one that checks for negative.
  if (leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0) {
    ....
  } else {
    chans[chan].leftVolume = leftvol;
    chans[chan].rightVolume = rightvol;

    chans[chan].sampleAddress = samplePtr;
    result = __AudioEnqueue(chans[chan], chan, true);
  }
}

Другой сценарий. За этими избыточными условиями скрывается какая-то ошибка. Возможно, проверили не то, что требуется.

Ctrl+C Ctrl+V наносит ответный удар

static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
  if (!Memory::IsValidAddress(psmfData) ||
      !Memory::IsValidAddress(psmfData)) {
    return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
  }
  ....
}

V501 There are identical sub-expressions '!Memory::IsValidAddress(psmfData)' to the left and to the right of the '||' operator. scePsmf.cpp 703

Обратите внимание на проверку внутри if. Вам не кажется странным, что мы проверяем, валиден ли адрес psmfData, целых два раза? Вот и мне кажется это странным... На самом деле, перед нами, конечно, опечатка, и идея была в том, чтобы проверить оба входных параметра.

Корректный вариант:

static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
  if (!Memory::IsValidAddress(psmfStruct) ||
      !Memory::IsValidAddress(psmfData)) {
    return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
  }
  ....
}

Забытая переменная

extern void ud_translate_att(
  int size = 0;
  ....
  if (size == 8) {
    ud_asmprintf(u, "b");
  } else if (size == 16) {
    ud_asmprintf(u, "w");
  } else if (size == 64) {
    ud_asmprintf(u, "q");
  }
  ....
}

Предупреждение PVS-Studio: V547 Expression 'size == 8' is always false. syn-att.c 195

Эта ошибка находится в папке ext, поэтому не совсем относится к проекту, но ошибка была найдена до того, как я обратил внимание на это, так что решил оставить. Всё-таки эта статья не про обзор ошибок, а про интеграцию с Travis CI, и никакой настройки анализатора не проводилось.

Переменная size инициализируется константой, однако, совершенно не используется в коде, вплоть до оператора if, который, само собой, выдает false во время проверки условия, ведь, как мы помним, size равна нулю. Последующие проверки смысла тоже не имеют.

Судя по всему, автор фрагмента кода забыл о том, чтобы перезаписать переменную size перед этим.

Stop

На этом, пожалуй, закончим с ошибками. Цель данной статьи продемонстрировать работу PVS-Studio совместно с Travis CI, а не как можно тщательнее провести анализ проекта. Если хочется ошибок побольше и покрасивее, то на них всегда можно полюбоваться здесь :).

Заключение

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

Полезные ссылки

Популярные статьи по теме
Главный вопрос программирования, рефакторинга и всего такого

Дата: 14 Апр 2016

Автор: Андрей Карпов

Вы угадали, ответ - "42". Здесь приводится 42 рекомендации по программированию, которые помогут избежать множества ошибок, сэкономить время и нервы. Автором рекомендаций выступает Андрей Карпов - тех…
Зло живёт в функциях сравнения

Дата: 19 Май 2017

Автор: Андрей Карпов

Возможно, читатели помнят мою статью под названием "Эффект последней строки". В ней идёт речь о замеченной мной закономерности: ошибка чаще всего допускается в последней строке однотипных блоков текс…
Как и почему статические анализаторы борются с ложными срабатываниями

Дата: 20 Мар 2017

Автор: Андрей Карпов

В своей предыдущей статье я писал, что мне не нравится подход, при котором статические анализаторы кода оцениваются с помощью синтетических тестов. В статье приводился пример, воспринимаемый анализат…
Характеристики анализатора PVS-Studio на примере EFL Core Libraries, 10-15% ложных срабатываний

Дата: 31 Июл 2017

Автор: Андрей Карпов

После большой статьи про проверку операционной системы Tizen мне было задано много вопросов о проценте ложных срабатываний и о плотности ошибок (сколько ошибок PVS-Studio выявляет на 1000 строк кода)…
PVS-Studio для Java

Дата: 17 Янв 2019

Автор: Андрей Карпов

В седьмой версии статического анализатора PVS-Studio мы добавили поддержку языка Java. Пришло время немного рассказать, как мы начинали делать поддержку языка Java, что у нас получилось и какие дальн…
Как PVS-Studio оказался внимательнее, чем три с половиной программиста

Дата: 22 Окт 2018

Автор: Андрей Карпов

PVS-Studio, как и другие статические анализаторы кода, часто выдаёт ложные срабатывания. Но не стоит спешить считать странные срабатывания ложными. Это короткая история о том, как PVS-Studio вновь ок…
Технологии, используемые в анализаторе кода PVS-Studio для поиска ошибок и потенциальных уязвимостей

Дата: 21 Ноя 2018

Автор: Андрей Карпов

Краткое описание технологий, используемых в инструменте PVS-Studio, которые позволяют эффективно обнаруживать большое количество паттернов ошибок и потенциальных уязвимостей. Статья описывает реализа…
Статический анализ как часть процесса разработки Unreal Engine

Дата: 27 Июн 2017

Автор: Андрей Карпов

Проект Unreal Engine развивается - добавляется новый код и изменятся уже написанный. Неизбежное следствие развития проекта - появление в коде новых ошибок, которые желательно выявлять как можно раньш…
Эффект последней строки

Дата: 31 Май 2014

Автор: Андрей Карпов

Я изучил множество ошибок, возникающих в результате копирования кода. И утверждаю, что чаще всего ошибки допускают в последнем фрагменте однотипного кода. Ранее я не встречал в книгах описания этого …
Любите статический анализ кода!

Дата: 16 Окт 2017

Автор: Андрей Карпов

Я в шоке от возможностей статического анализа кода, хотя сам участвую в разработке инструмента PVS-Studio. На днях я был искренне удивлён тому, что анализатор оказался умнее и внимательнее меня.

Комментарии (0)

Следующие комментарии

На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Этот сайт использует куки и другие технологии, чтобы предоставить вам более персонализированный опыт. Продолжая просмотр страниц нашего веб-сайта, вы принимаете условия использования этих файлов. Если вы не хотите, чтобы ваши данные обрабатывались, пожалуйста, покиньте данный сайт. Подробнее →
Принять