Экспертиза процесса разработки программного обеспечения

Судебная экспертиза исходного кода на C++

Исследуем программы на C++ — от промышленной автоматики и прошивок до расчётных систем: передан ли исходный код, собирается ли из него спорная программа и почему она отказывает.

Ориентир по стоимости экспертизы
от 100 000 ₽
Ориентир по сроку экспертизы
от 10 рабочих дней
  • Судебные экспертизы
  • Внесудебные исследования
  • Рецензирование заключений
  • Консультации и справки
01 Проверим компетенцию

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

02 Поможем подготовиться

Уточним вопросы и перечень материалов — готовый комплект не обязателен.

03 Работаем с регионами

Принимаем задачи из России, Казахстана и Беларуси. До назначения часть материалов можно передать электронно; по назначенной экспертизе порядок определяет назначивший орган.

04 Сопровождаем результат

Разъясняем методику и выводы, отвечаем на вопросы суда в пределах компетенции эксперта.

О направлении

Подробно о задачах, объектах и методиках

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

Содержание страницы
  1. С какими спорами приходят по программам на C++
  2. Что сохранить, пока сборочная среда цела
  3. Почему по C++ спор начинается с того, передан ли исходный код
  4. Что можно установить по готовой программе, когда исходников нет
  5. Почему один и тот же исходный текст даёт разные исполняемые файлы
  6. Отключение отладочных проверок убирает часть строк, и это учитывают отдельно
  7. Отладочная информация: что она даёт и почему её обычно нет
  8. Неопределённое поведение: программа работает не потому, что она правильная
  9. Аварийные завершения, зависания и рост потребления памяти
  10. Библиотеки, статическая сборка и условия их использования
  11. Если объект — прошивка, контроллер или промышленная линия
  12. Работы на действующем оборудовании: как это согласуют
  13. Если в проекте не только C++
  14. Что устанавливает эксперт по коду на C++
  15. Как проверяют соответствие заданию, когда программу нельзя просто запустить
  16. Какие объекты исследуются в споре о программе на C++
  17. Как передать исходники и сборочную среду
  18. Порядок исследования программы на C++
  19. Примеры вопросов эксперту по коду на C++
  20. В каком виде можно получить результат
  21. От чего зависят стоимость и срок по проекту на C++

В споре о программе на C++ обычно проверяют, соответствует ли результат техническому заданию и что именно передал разработчик. Программу перед запуском компилируют в машинный код. Его можно исследовать и частично декомпилировать, но точно восстановить по нему первоначальный текст, комментарии и структуру проекта нельзя. Поэтому сначала устанавливают, являются ли переданные файлы исходным кодом спорной программы и можно ли получить из них проверяемую сборку. Экспертиза исходного кода на C++ — специализированное направление экспертизы процесса разработки программного обеспечения. В зависимости от процедуры результатом будет заключение судебного эксперта или документ внесудебного исследования; доказательственное значение оценивает суд.

Если спор уже начался, сохраните не только код, но и сведения о его сборке. Для сопоставления исходников со спорной программой важны версии компилятора и библиотек, настройки и файлы сборки. Без них точное воспроизведение может оказаться невозможным. Эти данные часто остаются только на машинах разработчиков и сервере сборки и могут исчезнуть после переустановки или очистки. Что именно сохранять, разобрано ниже, в разделе «Что сохранить, пока сборочная среда цела».

Предварительный разбор задачи бесплатный: достаточно описать спор и перечислить имеющиеся материалы. Собирать архивы к этому моменту не требуется — как безопасно их передать, договоримся позже.

С какими спорами приходят по программам на C++

Обращаются, когда разногласия касаются проверяемых обстоятельств: состава переданных материалов, поведения программы при заданных условиях и зафиксированного хода работ. До исследования определяют спорные версию, сборку и период.

Типичные ситуации выглядят так:

  • подрядчик сдал программу для станка, производственной линии, прибора учёта или расчётной системы, а заказчик считает техническое задание невыполненным;
  • заказчику передали установочный комплект и обещали исходный код, а в архиве оказались файлы, из которых спорную программу собрать нельзя;
  • программа аварийно завершается, зависает или со временем занимает всю доступную память, и стороны спорят, дефект это или условия эксплуатации;
  • одна и та же версия работает на одном компьютере и отказывает на другом, а объяснения сторон расходятся;
  • заказчик утверждает, что подрядчик использовал чужой код или библиотеку с открытой лицензией и нарушил её условия;
  • спорят об объёме сделанного: что написано подрядчиком, а что взято из готовых библиотек вроде Boost или Qt;
  • требуется установить, к какому периоду относится спорная версия, — при отсутствии истории изменений.

Если спор идёт не о программе, а об устройстве, на котором она работает, — о его исправности, комплектности или следах вмешательства, — начните с аппаратно-компьютерной экспертизы.

Что сохранить, пока сборочная среда цела

В проектах на C++ особенно легко утратить возможность повторить прежнюю сборку: машины разработчиков переустанавливают, сервер сборки перенастраивают, а нужные версии Visual Studio, GCC и Clang со временем становится сложнее получить. Поэтому одной копии исходников часто недостаточно.

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

  • сохраните зеркальную копию репозитория со всеми доступными ссылками, ветками, метками и достижимой историей; при споре о переписывании истории отдельно фиксируют серверное хранилище и журналы сервиса. Если системы контроля версий не было, сохраните каталог с исходными текстами целиком;
  • сохраните исполняемые файлы спорной версии ровно в том виде, в каком они работают, и связанную отладочную информацию: PDB в Windows, встроенные либо отдельные файлы в Linux и каталог .dSYM в macOS;
  • зафиксируйте сборочную среду: точные версии и контрольные суммы компилятора, компоновщика и других средств, SDK, системные и сторонние библиотеки, генератор и сценарии сборки, параметры, переменные, операционную систему, архитектуру, локаль, пути и операции после сборки. Полезно сохранить образ машины или контейнера вместе с файлами описания сборки (CMakeLists, Makefile, файлы проекта Visual Studio);
  • заберите записи сервера сборки за спорный период и снимки памяти аварийно завершившихся процессов, если они сохранялись;
  • посчитайте контрольную сумму каждого архива и запишите её отдельным документом. Контрольная сумма — это строка, вычисленная из содержимого файла: она позволяет проверить соответствие файла записанному значению, но сама не подтверждает дату и источник. В Windows её вычисляют в PowerShell командой Get-FileHash архив.zip -Algorithm SHA256, в обычной командной строке — certutil -hashfile архив.zip SHA256; в Linux — sha256sum архив.zip, в macOS — shasum -a 256 архив.zip;
  • составьте короткую записку: что именно сохранено, откуда, когда, под какой учётной записью и кто присутствовал.

Список технический, и выполнять его должен тот, у кого есть законный доступ к репозиторию и сборочной среде. Если доступ есть только у подрядчика, письменно запросите материалы по договору и сохраните ответ. Параллельно зафиксируйте доступное вам: установленную программу, переписку и акты. Способ обеспечения доказательств зависит от стадии и вида процесса; возможность нотариального действия или обращения в суд лучше заранее обсудить с юристом. Для истребования материалов у другой стороны потребуется указать доказательство, подтверждаемые им обстоятельства, причины невозможности получить его самостоятельно и место нахождения. Если не уверены, с чего начать, позвоните по номеру 8 (800) 333-24-09 — подскажем порядок применительно к вашей ситуации, это бесплатно.

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

Для копии, снятой своими силами, важно подтвердить происхождение. Контрольная сумма позволяет позднее проверить соответствие файла записанному значению, но не подтверждает отсутствие промежуточных изменений, дату и источник. Поэтому отдельно фиксируют порядок копирования, источник, время и участников; доступные процессуальные способы обеспечения доказательств зависят от обстоятельств дела.

Почему по C++ спор начинается с того, передан ли исходный код

В некоторых проектах развёрнутая система содержит значительную часть читаемых исходных файлов. С C++ иначе: заказчик нередко получает только исполняемый файл, а исходный текст остаётся у подрядчика. Недостаток комплекта обнаруживается, когда программу нужно проверить или доработать.

Две вещи здесь путать нельзя. Дизассемблирование и декомпиляция с помощью инструментов вроде IDA Pro и Ghidra дают реконструкцию, а не исходный код. В программе могут сохраниться символы, сведения о типах и пути к файлам. Без соответствующей отладочной информации обычно не сохраняются комментарии, авторские пояснения и исходные имена локальных переменных. Связь с отдельными файлами иногда прослеживается по служебным данным, но исходную структуру проекта по ним точно не восстановить.

Сначала эксперт устанавливает, чем являются переданные материалы: исходным текстом спорной программы, текстом другого проекта или файлами иного вида. Этот проверяемый факт определяет пределы дальнейшего исследования.

Что можно установить по готовой программе, когда исходников нет

Без исходного текста исследование всё равно возможно: на часть вопросов можно ответить непосредственно по собранной программе.

По исполняемому файлу, если сохранились соответствующие признаки, устанавливают или оценивают:

  • под какую систему и архитектуру он собран, а в ряде случаев — семейство и признаки версии компилятора;
  • какие внешние зависимости указаны и какие библиотеки удаётся распознать по сигнатурам или метаданным;
  • какие тексты, сообщения и адреса он содержит — в том числе имена, уцелевшие в таблице символов;
  • какие системные функции импортированы или наблюдаются при выполнении: работа с файлами, сетью, устройствами, реестром;
  • есть ли признаки защиты от анализа и электронная подпись, какие сведения содержит подпись и проходит ли её проверка;
  • совпадает ли он с другим исполняемым файлом и в чём именно расходится.

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

Почему один и тот же исходный текст даёт разные исполняемые файлы

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

Расхождение не обязательно означает различие исходного текста. На результат влияют версии GCC, Clang или компилятора Visual Studio, настройки оптимизации, разрядность, целевая система, компоновщик, порядок входных файлов и состав библиотек. В исполняемый файл или сопутствующие данные могут попасть время сборки, пути, идентификаторы и иные сведения об окружении; после сборки файл может измениться из-за подписи. Побайтовое совпадение возможно в проекте с воспроизводимой сборкой, но его нельзя предполагать без проверки процесса.

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

Отключение отладочных проверок убирает часть строк, и это учитывают отдельно

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

Переданный текст собирают дважды с одинаковыми условиями, а затем проводят контрольную сборку с заранее выбранным изменением. Сравнение помогает отделить непостоянные служебные данные от различий, связанных с настройками или исходниками. Результат не сводят к единому «уровню шума»: для каждого отличия устанавливают расположение, природу и влияние на исследуемую функцию.

Затем полученную сборку сопоставляют со спорным файлом по совокупности признаков. Текстовые строки, внешние вызовы, размеры данных, ресурсы, символы и сведения о типах могут быть полезны, но их устойчивость зависит от компилятора и настроек. В частности, отключение отладочных проверок может убрать часть строк. Оптимизатор меняет границы функций, встраивает и объединяет фрагменты, поэтому простое сравнение числа функций неинформативно. Поведение оценивают только в зафиксированных условиях с учётом возможного неопределённого поведения.

В выводе перечисляют совпадения, различия и проверенные версии их причин. Неудачная сборка сама по себе не доказывает, что переданы другие исходники: причиной может быть неполный комплект или утраченное окружение. При сравнении отделяют стандартные и сторонние библиотеки, служебный и сгенерированный код. Если материалов недостаточно, эксперт указывает, что вопрос по представленным объектам не решается, и называет недостающие данные.

Отладочная информация: что она даёт и почему её обычно нет

При сборке компилятор может сохранить сведения, связывающие машинный код с исходным текстом: имена функций и переменных, номера строк, сведения об исходных файлах. В Windows обычно используют файл PDB, в Linux — встроенные или отдельные отладочные файлы, в macOS — каталог .dSYM.

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

Отладочную информацию сверяют со спорной программой. При наличии используют PDB GUID/age, ELF build ID, Mach-O UUID или другой идентификатор; иначе сопоставляют контрольные суммы, метаданные модулей и прочие признаки. Данные от иной сборки могут показать правдоподобные, но неверные имена и строки. Так же проверяют соответствие снимка памяти исполняемому файлу и загруженным модулям.

Проверяют и то, не применялись ли средства, специально затрудняющие изучение программы. Их наличие — самостоятельный факт: он объясняет, почему часть вопросов осталась без ответа, и сам по себе бывает предметом спора, когда заказчик рассчитывал получить сопровождаемую систему.

Неопределённое поведение: программа работает не потому, что она правильная

В C++ неопределённое поведение особенно существенно при анализе отказов.

Для ряда ошибочных операций — обращения к освобождённой памяти, выхода за границы массива, переполнения знакового целого — стандарт C++ не определяет дальнейшее поведение и не требует немедленной остановки. Такая программа может долго работать без наблюдаемого отказа, а затем проявить дефект после смены компилятора, оптимизации, библиотеки или данных, хотя исходный текст не изменился.

Для спора это означает две вещи. Первая: «программа работала три года» не доказывает отсутствие скрытой ошибки. Вторая: отказ после обновления окружения сам по себе не означает, что дефект внёс тот, кто обновлял. Эксперт может проверить код статическими средствами, воспроизвести отказ и выполнить инструментированные сборки. AddressSanitizer выявляет ряд ошибок памяти, UndefinedBehaviorSanitizer — в том числе некоторые переполнения знаковых целых; Valgrind проверяет отдельные ошибки во время выполнения без такой пересборки. Динамическая проверка охватывает только фактически выполненные пути, а отсутствие сообщения инструмента не доказывает отсутствие дефекта. Эксперт устанавливает технические факты, а ответственность сторон по договору оценивает суд.

Аварийные завершения, зависания и рост потребления памяти

Это распространённая техническая претензия, для исследования которой особенно важны следы выполнения.

При аварийном завершении система может сохранить снимок памяти процесса. В Linux и macOS его называют core dump, в Windows — аварийным дампом. В Windows локальное автоматическое сохранение для обычных программ нужно настраивать заранее. Сначала устанавливают тип дампа и включённые в него данные. Возможность восстановить стек, участок выполнения и значения зависит от состава файла, оптимизации, доступной памяти и соответствующей отладочной информации; отсутствующие сведения указывают как ограничение.

Без одной оговорки вывод разваливается: место падения не равно месту дефекта. Порча памяти проявляется в другой части программы, иногда спустя минуты после ошибки, поэтому цепочка вызовов из снимка — отправная точка исследования, а не ответ. Причину эксперт устанавливает, проверив альтернативные объяснения: неверные входные данные, нехватку ресурсов, отказ оборудования, действия другой программы.

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

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

Библиотеки, статическая сборка и условия их использования

При динамическом подключении библиотека остаётся внешним модулем: он может находиться рядом с программой, в системном каталоге или загружаться иным способом. Импорт обычно позволяет установить имя зависимости, а версию — лишь при наличии метаданных, контрольной суммы или эталонного файла. При статическом подключении код библиотеки входит в исполняемый файл, поэтому состав определяют по совокупности сигнатур, строк и служебных сведений, разделяя надёжные и предположительные результаты.

В C++ нет единого обязательного файла, закрепляющего версии всех зависимостей. Такие сведения могут фиксировать менеджеры пакетов Conan и vcpkg, но они используются не во всех проектах. Поэтому состав восстанавливают по файлам сборки, репозиторию, кешам зависимостей и самой программе, указывая, какой источник подтверждает каждый вывод.

Условия использования библиотеки записаны в её лицензии — MIT, BSD, Apache, GPL, LGPL; у Boost — собственная лицензия, существуют и другие. Эксперт устанавливает идентифицируемую библиотеку, подтверждённую версию, способ подключения и реквизиты лицензионного документа; относящиеся к вопросу положения приводят в необходимом объёме. Толкование лицензии, вывод о правах на программу и наличии нарушения относятся к правовой оценке.

Если объект — прошивка, контроллер или промышленная линия

C++ применяют в микроконтроллерах (STM32, решения на ядре ARM, AVR), промышленных компьютерах и отдельных компонентах оборудования. Объектом может быть прошивка контроллера или прикладная программа. Язык программ ПЛК вроде Siemens SIMATIC и систем на CODESYS устанавливают отдельно: там часто используются иные специализированные языки. Для анализа взаимодействия сохраняют записи обмена по Modbus, PROFINET, CANopen, OPC UA. Исследовать приходится и программу, и связанное с ней устройство.

Способ получения зависит от платформы: файл поставки, штатная выгрузка, загрузчик, JTAG или SWD, программатор, средства вроде OpenOCD либо аппаратное извлечение памяти. Файл обновления может отличаться от содержимого устройства. Отладочный интерфейс открывает только доступные области, поэтому фиксируют карту памяти, внешние носители, конфигурацию защиты и пределы полноты образа. Любое вмешательство требует оценки риска остановки или повреждения.

До чтения проверяют защиту устройства. В некоторых режимах снятие защиты стирает память, а отладочный интерфейс может быть отключён. Поэтому сначала изучают документацию и состояние защиты, затем выбирают безопасный способ. Невозможность получить прошивку — допустимый результат исследования; риск уничтожения объекта недопустимо скрывать.

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

Работы на действующем оборудовании: как это согласуют

Если проверка требует доступа к работающей линии, прибору или станку, она перестаёт быть только исследовательской задачей и становится работой на производственном объекте. Порядок здесь задаёт не эксперт, а эксплуатирующая организация.

До выезда согласуют несколько вещей:

  • кто со стороны владельца оборудования отвечает за работы и допускает к ним: все действия выполняются в присутствии и под контролем его персонала, а подключение к оборудованию — силами этого персонала;
  • будет ли оборудование остановлено, выведено в безопасное состояние или продолжит работу и что допустимо делать в каждом случае;
  • какие меры обеспечивают это состояние: отключение и блокировка от ошибочного или автоматического пуска, снятие остаточной энергии, оповещение смежных участков — конкретный порядок определяет владелец;
  • кто и как проводит инструктаж и какие средства защиты нужны на участке;
  • окно работ и порядок оформления допуска по правилам самой организации — наряд-допуск или иной принятый у неё документ;
  • что делать, если проверка приведёт к незапланированной остановке, и кто несёт связанные с ней расходы;
  • требования эксплуатационной документации изготовителя к подключению и считыванию — их выполняют в первую очередь, даже если это ограничивает исследование.

Подключение к контроллеру и снятие прошивки выполняют по правилам эксплуатирующей организации, а эксперт фиксирует ход, условия и результаты. Состав участников определяют назначивший орган и владелец оборудования; участие заинтересованного подрядчика и каждое его действие протоколируют и контролируют. Испытания на действующей линии допустимы только по утверждённой программе, после оценки риска и при разрешении эксплуатационной документации; иначе используют остановленное оборудование или эквивалент. После назначения судебной экспертизы доступ согласуют через назначивший орган.

Если в проекте не только C++

Крупные системы редко пишут на одном языке: вокруг расчётного ядра на C++ появляются интерфейсы, сервисы и средства обмена на других языках. Границы исследования лучше определить до постановки вопросов, чтобы поручение соответствовало спорной задаче.

Границы обычно проводят так:

  • спор о расчётном ядре, драйвере, обработке сигналов, работе с оборудованием или производительности: это как раз тема страницы, которую вы читаете;
  • спор о серверной части корпоративной системы или об обмене документами: экспертиза кода на Java;
  • спор о воспроизводимости расчётов при обработке данных и формировании отчётности: экспертиза кода на Python;
  • спор о поведении интерфейса в браузере: экспертиза кода на JavaScript;
  • спор о сайте или интернет-магазине: экспертиза кода на PHP.

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

Что устанавливает эксперт по коду на C++

Круг устанавливаемых обстоятельств задают поставленные вопросы и представленные объекты. По этому направлению обычно проверяют следующее:

  • исходный ли это текст спорной программы и собирается ли из него работающая программа;
  • соответствие реализованного техническому заданию — по каждому проверяемому требованию, с указанием способа проверки;
  • причина аварийного завершения, зависания или роста потребления памяти при воспроизведённом сценарии;
  • состав использованных библиотек, способ их подключения и то, какими лицензионными документами они сопровождаются;
  • совпадения между двумя кодовыми базами с отдельной оценкой библиотечного, шаблонного и сгенерированного кода;
  • чем спорная версия отличается от предыдущей и что именно изменилось между ними;
  • период, к которому относится спорная версия, — по совокупности источников;
  • объём собственного кода в измеримых единицах, с оговоркой, что объём — ещё не стоимость.

Эксперт не оценивает добросовестность сторон, не толкует условия договора и не определяет размер убытков: это вопросы права и, при необходимости, отдельной экономической экспертизы. Если спор о деньгах, вопрос о стоимости ставят отдельно — его решает экспертиза объёма и стоимости работ.

Как проверяют соответствие заданию, когда программу нельзя просто запустить

Проверка идёт по требованиям, а не по общему впечатлению. Из технического задания, приложений и переписки эксперт выбирает формулировки, допускающие проверку, и по каждой указывает способ. Сложность в том, что многие программы на C++ не запускаются в отрыве от своего окружения: им нужны оборудование, внешние системы, определённая операционная система или объём данных.

Поэтому способ проверки выбирают под требование. Часть требований проверяется чтением исходного текста — если он есть и если требование сформулировано в терминах устройства программы. Часть — сборкой и запуском на стенде, воспроизводящем условия эксплуатации. Часть — на самом оборудовании заказчика, в порядке, описанном выше. А часть проверить невозможно, и это самостоятельный результат: он показывает суду, чего именно недостаёт, вместо того чтобы подменять проверку рассуждением.

Результат проверки формулируют как факт: требование реализовано, реализовано частично, не реализовано или не может быть проверено на представленных объектах; указывают способ и полученные данные. Правовую оценку существенности недостатка и его влияния на приёмку даёт суд. Если язык для вопроса не имеет значения, проводят экспертизу соответствия работ техническому заданию.

Какие объекты исследуются в споре о программе на C++

Состав объектов зависит от вопросов, но обычно включает две группы.

Исходный код и то, что из него получается

Основные объекты — исходные материалы и результаты сборки:

  • исходные тексты со всеми вспомогательными файлами и файлами описания сборки;
  • репозиторий системы контроля версий — чаще всего Git — со всеми доступными ссылками и достижимой историей; полноту и признаки переписывания проверяют отдельно;
  • сведения о сборочной среде: точные версии инструментов, SDK и библиотек, параметры и сценарии сборки, ОС, архитектура, локаль и операции после сборки;
  • используемые библиотеки в том виде, в каком они подключались, с указанием версий;
  • исполняемые файлы спорной версии и, если есть, предыдущих;
  • отладочная информация, если она сохранилась у разработчика;
  • прошивка и сведения об устройстве, если спор о встроенной программе: модель контроллера, версия среды разработки, файлы проекта, записи промышленного обмена. Прошивку получают уполномоченные специалисты по правилам эксплуатирующей организации и в порядке, описанном выше.

Следы выполнения и документы проекта

Материалы, по которым восстанавливают ход событий и требования:

  • снимки памяти при аварийных завершениях и журналы самой программы;
  • системные журналы за спорный период;
  • записи сервера сборки: когда, из чего и с какими настройками собирались версии;
  • техническое задание, приложения, акты, переписка сторон, задачи в системе учёта;
  • документы на приобретение коммерческих библиотек и инструментов разработки.

Как передать исходники и сборочную среду

Образы сборочной среды и снимки памяти могут занимать десятки гигабайт. Поэтому заранее согласуют объём материалов, канал передачи и круг допущенных лиц.

Исходники, настройки и дампы могут содержать пароли, персональные данные и ключи подписи. Исходную копию сохраняют неизменной и защищённой. Для передачи готовят документированную производную копию с маскированием действующих секретов, если это не уничтожает исследуемый признак. Ключи и пароли отзывают без неоправданной задержки; закрытые ключи исследуют на месте либо подтверждают их идентификаторами и журналами операций. Если секрет необходим как объект исследования, для него отдельно согласуют защищённую процедуру.

Объём раскрытия и порядок доступа зависят от процедуры и поставленных вопросов. До передачи обсудите с юристом исследование на территории владельца, ограничение состава материалов и меры конфиденциальности. В судебной экспертизе эти вопросы ставят перед назначившим органом.

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

Порядок исследования программы на C++

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

  1. Принимаются материалы, фиксируется их состав и контрольные суммы; описывается, откуда и когда получена каждая копия.
  2. Фиксируется или восстанавливается сборочная среда; контрольными сборками выявляют недетерминированные области и влияние отдельных параметров.
  3. Устанавливается, чем являются переданные материалы: собирается ли из них программа и связана ли она со спорным объектом.
  4. Проверяют связь вспомогательных материалов с объектом: отладочную информацию и снимки памяти сопоставляют по доступным идентификаторам и метаданным.
  5. По каждому проверяемому требованию выполняется проверка выбранным способом; условия получения результата фиксируются.
  6. Проверяются альтернативные объяснения обнаруженного: настройки среды, данные, действия третьих лиц, особенности оборудования.
  7. Формулируются выводы в пределах поставленных вопросов; перечисляются ограничения и то, что установить не удалось.

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

Примеры вопросов эксперту по коду на C++

Корректный вопрос точно идентифицирует объект — например, архив, исполняемый файл, прошивку, дамп или оборудование — и называет проверяемый критерий, условия либо сценарий. При судебной экспертизе круг вопросов определяет назначивший орган. Эксперт отвечает в пределах специальных знаний и представленных материалов; о неясности или недостаточности вопроса сообщает в установленном порядке. Помочь сформулировать вопросы можно до назначения.

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

  1. Может ли представленный исполняемый файл быть получен из исходных текстов архива с контрольной суммой SHA-256 … в воспроизведённой сборочной среде; какие соответствия, различия и ограничения выявлены?
  2. Соответствует ли программа, полученная сборкой из архива …, требованиям пунктов … технического задания (приложение № … к договору от …)?
  3. Какие сторонние библиотеки использованы в программе …, каким способом они подключены и какими лицензионными документами сопровождаются?
  4. Какие технические причины аварийного завершения программы … подтверждаются снимком памяти … и сценарием, описанным в …; достаточно ли материалов для установления причинной связи?
  5. Имеются ли в исходных текстах архива … и архива … совпадения; каково происхождение и значение общих библиотек, стандартных конструкций и сгенерированного кода?
  6. Чем версия программы, представленная файлом …, отличается от версии, представленной файлом …, в части реализации функций, указанных в пунктах … технического задания?

В каком виде можно получить результат

Исследование проводят в одном из нескольких форматов; выбор зависит от стадии спора:

  • судебная экспертиза по определению суда или постановлению органа расследования — с предупреждением эксперта об уголовной ответственности за заведомо ложное заключение;
  • внесудебное исследование по договору со стороной — до подачи иска или параллельно с ним;
  • письменная консультация по материалам, когда нужно понять перспективы спора и правильно поставить вопросы;
  • участие специалиста в судебном заседании для пояснений по проведённому исследованию;
  • рецензирование чужого заключения — подробнее на странице рецензии на заключение о процессе разработки.

После назначения судебной экспертизы дополнительные материалы, доступ к оборудованию и новые вопросы передают через назначивший орган, а не непосредственно от одной из сторон. Эксперт не даёт стороне частных оценок по существу поручения. Если специалист раньше работал для участника спора, это раскрывают при рассмотрении кандидатуры; решение о назначении и отводе принимает назначивший орган.

От чего зависят стоимость и срок по проекту на C++

Стоимость и срок определяют три обстоятельства. Первое — состав объектов: анализ исполняемого файла без исходников и отладочной информации становится самостоятельной задачей, а защита от изучения повышает трудоёмкость. Второе — воспроизводимость сборки: восстановление утраченной среды может дать ограниченный результат. Третье — необходимость работы с оборудованием, которая требует согласования, допуска и персонала владельца. Учитываются также объём спорного контура, число требований и вопросов, участие смежных специалистов. Ориентир для судебной экспертизы — от 100 000 ₽, ориентировочный срок — от 10 рабочих дней; точные условия определяются после просмотра материалов.

Чтобы начать, архивы собирать не надо. Хватит описания спора, названия программы и перечня имеющихся материалов: договор, задание, переписка, доступы к репозиторию. Позвоните по номеру 8 (800) 333-24-09 или оставьте заявку: мы скажем, относится ли задача к нашей компетенции, какое направление экспертизы ей соответствует, что стоит сохранить и каких данных не хватает для расчёта стоимости.

Проведение экспертизы по уголовному делу

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

Согласно постановлению Пленума Верховного Суда Российской Федерации от 21 декабря 2010 г. № 28 «О судебной экспертизе по уголовным делам», негосударственными судебно-экспертными учреждениями признаются некоммерческие организации, созданные на основании Гражданского кодекса Российской Федерации и Федерального закона «О некоммерческих организациях» и ведущие судебно-экспертную деятельность согласно своим уставам.

По сведениям организации, проведение судебных экспертиз предусмотрено её уставом (см. действующую редакцию в разделе «Документы организации»). Это само по себе не означает автоматического поручения любой экспертизы. Возможность поручить конкретное исследование определяет назначающий орган.

В случаях, перечисленных пунктом 5 постановления № 28, когда экспертизу по уголовному делу назначает суд, ему следует мотивировать в определении или постановлении поручение исследования учреждению либо конкретному лицу. Пункт 5 постановления № 28 связывает выбор негосударственного учреждения с невозможностью провести исследование в государственном учреждении, обслуживающем соответствующую территорию: например, из-за отсутствия нужного специалиста, материально-технической базы или специальных условий, либо с отводом компетентных государственных учреждений. Дополнительно учитываются квалификация эксперта, основания для отвода и действующий перечень экспертиз, выполняемых только государственными судебно-экспертными организациями.

Актуализировано
Форматы работы

Стоимость и сроки

Указан предварительный ориентир. Точный расчёт зависит от вопросов, объёма материалов, количества объектов и необходимости выезда. Срок рассчитываем после получения и проверки необходимого комплекта.

По договору

Внесудебное исследование

от 100 000 ₽
от 10 рабочих дней
точная стоимость будет определена после ознакомления с объектом исследования

Итог — письменный документ с результатами внесудебного исследования. Название документа, порядок его представления и оценка зависят от вида процесса.

Заказать исследование
Проверка готового заключения

Рецензирование

от 80 000 ₽
10 рабочих дней
точная стоимость будет определена после ознакомления с заключением и приложениями

Итог — письменная рецензия на готовое заключение. Она проверяет исходные данные, методы и выводы, но не отменяет заключение и не заменяет новое исследование объекта.

Передать заключение на проверку
Письменный ответ эксперта

Консультация и справка

от 20 000 ₽
2–3 рабочих дня
точная стоимость будет определена после ознакомления с объектом исследования

Поможет предварительно оценить вопрос, его исследуемость и ограничения будущей работы, а также спланировать дальнейшие действия.

Описать вопрос
Разбор задачи — без оплаты

Бесплатно определим вид исследования, проверим, нет ли явных пробелов в комплекте материалов, и назовём ориентировочные срок и стоимость. Если уже на этом этапе видно, что задачу решить нельзя, скажем об этом и не будем предлагать полное исследование. Изучение материалов по существу с письменным ответом — платная консультация; её стоимость согласуем до начала.

Получить организационный разбор
Организация исследования

Как строится работа над экспертизой

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

  1. 01 Организационный разбор

    Проверяем компетенцию и сообщаем, можно ли провести исследование по поставленной задаче.

  2. 02 Вопросы и материалы

    Уточняем вопросы и сообщаем, каких документов или объектов не хватает.

  3. 03 Экспертное исследование

    Эксперт применяет профильные методики, фиксирует ход работы и обосновывает выводы.

  4. 04 Заключение и пояснения

    Передаём результат и при необходимости разъясняем суду применённую методику и выводы.

Выполненные исследования

Практика по этому направлению

Краткие описания выполненных исследований показывают задачи и объекты. В конкретном деле круг вопросов определяет назначивший орган, а вопросы о виновности, принадлежности прав и обоснованности требований разрешает суд.

Все примеры по направлению
Опубликованный пример
Завершена в мае 2023 года

Экспертиза исходного кода программ в споре об авторских правах №133852

Разработчики спорили о происхождении клиентской и серверной программ: судебная компьютерно-техническая экспертиза проверяла связь исходного кода и редакций.

Гагаринский районный суд города МосквыДело №02-0033/2023
Участники: АО "СталкерСофт", КоммьюниГейт Инк, КоммьюниГейт Системс САС
Открыть описание
Опубликованный пример
Завершена в ноябре 2022 года

Экспертиза исходного кода коммуникационных программ в Москве №116890

Спор об авторских правах касался происхождения коммуникационного приложения: судебная компьютерно-техническая экспертиза проверяла состав и взаимосвязь программ.

Гагаринский районный суд города МосквыДело №02-0033/2023
Участники: АО "СталкерСофт", КоммьюниГейт Инк
Открыть описание
В открытом доступе представлена часть выполненных исследований по разным объектам и судебным делам. Сведения, защищённые законом или условиями конфиденциальности, не раскрываются. Чтобы проверить возможность исследования по вашей ситуации, опишите задачу.

Документы организации

Ответы специалистов

Частые вопросы

Практические пояснения о назначении, материалах и использовании экспертного заключения.

Все вопросы по направлению
С чем приходят на экспертизу программ на C++?

Исследование нужно там, где спор упирается в проверяемое состояние программы, а не только в толкование договора. Типичные поводы: подрядчик сдал работу, а заказчик считает задание невыполненным; вместо исходного кода передали комплект, из которого спорную программу собрать нельзя; программа аварийно завершается или со временем занимает всю память; одна и та же версия работает на одном стенде и отказывает на другом.

Отдельный повод — проверка чужого заключения. Если экспертиза по делу уже проведена и её выводы вызывают сомнения, разбирают не программу, а сам документ: описание объектов, воспроизводимость сборки, обоснованность выводов.

Не подойдёт экспертиза там, где вопрос правовой: были ли работы приняты, существенны ли недостатки, кто виноват в срыве сроков. Эксперт устанавливает факты, а оценку им даёт суд.

Отдельная страница: С чем приходят на экспертизу программ на C++?
Как проверить, что передан исходный код именно этой программы?

Проверяется, и это первый вопрос по таким спорам — часто самый результативный. Эксперт восстанавливает сборочную среду, собирает переданный текст и сравнивает результат со спорной программой.

Сравнение начинается с измерения собственной погрешности: одну и ту же сборку выполняют дважды с одинаковыми настройками и ещё раз с изменёнными. Так получают уровень шума — величину расхождений, не связанных с содержанием кода. Дальше сопоставляют устойчивые признаки: строки и сообщения, состав вызываемых функций системы и библиотек, структуру данных. Состав функций и поведение программы к устойчивым не относятся: их меняет оптимизатор.

Вывод «переданное не является исходным текстом» делают не из неудачной сборки, а из положительно установленного факта — например, из отсутствия функции, которая в спорной программе работает. Если материалов не хватает, эксперт пишет, что вопрос не решается, и называет, чего недостаёт.

Отдельная страница: Как проверить, что передан исходный код именно этой программы?
Можно ли восстановить исходный код из готовой программы?

В исходном виде — нет. Дизассемблирование и декомпиляция дают текст, который специалист читает, но это реконструкция, а не исходный код.

Часть сведений в собранной программе всё же сохраняется: искажённые имена функций в таблице символов, имена классов в служебных данных о типах, иногда пути к файлам из отладочных проверок. Чего в машинном коде нет никогда — комментариев, авторских пояснений, исходного разбиения на файлы и имён локальных переменных. Поэтому реконструкцию нельзя выдавать за переданный исходный код, а выводы о качестве текста и об авторстве по ней не строят.

Точность реконструкции резко возрастает, если сохранилась отладочная информация. Её стоит запросить у разработчика: в поставку она обычно не входит, но у него нередко остаётся.

Отдельная страница: Можно ли восстановить исходный код из готовой программы?
Собранный файл не совпал с рабочим — значит, передали не тот код?

Само по себе — нет. Один и тот же текст, собранный другой версией GCC, Clang или компилятора Visual Studio, даёт разный машинный код. То же делают настройки оптимизации, разрядность, целевая система, версия компоновщика и порядок подачи файлов.

Многие сборки записывают внутрь дату, имя машины и пути к исходникам; путь попадает в отладочные данные и сообщения об ошибках, а не в сам код, но файл всё равно отличается. Добавьте языковые настройки системы и подпись, которую ставят после сборки. Побайтовое совпадение достижимо только при специальной подготовке проекта — этим занимается направление воспроизводимых сборок.

Поэтому задачу ставят иначе: не «совпадают ли файлы», а «получается ли из переданного та же по существу программа», и сравнивают по признакам, устойчивым к настройкам.

Отдельная страница: Собранный файл не совпал с рабочим — значит, передали не тот код?
Что входит в сборочную среду и зачем её сохранять?

Это самое ценное и самое быстро исчезающее. Нужны версия и разрядность компилятора, набор вспомогательных программ, настройки оптимизации, целевая система, состав и версии библиотек, файлы описания сборки — CMakeLists, Makefile или файлы проекта Visual Studio.

Проще всего сохранить не перечень, а саму среду: образ машины или контейнера сборки целиком, пока он существует. Тогда воспроизведение занимает часы, а не недели, и не зависит от того, доступны ли ещё старые версии инструментов.

Если среда утрачена, эксперт восстанавливает её по описанию сборки, по служебным сведениям внутри исполняемого файла и по записям сервера сборки. Получится не всегда: вывод о соответствии переданного текста спорной программе может оказаться недостижимым — это ограничение указывают в заключении.

Отдельная страница: Что входит в сборочную среду и зачем её сохранять?
Что даёт отладочная информация и почему её обычно нет?

Отладочная информация связывает машинный код с исходным текстом: имена функций и переменных, номера строк, границы файлов. В Windows её обычно кладут в отдельный файл формата PDB, в Linux и macOS — внутрь программы или в отдельный каталог.

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

Полученную отладочную информацию проверяют на соответствие спорной программе по внутреннему идентификатору сборки, а не принимают на веру: данные от другой сборки дают правдоподобный и при этом неверный результат — имена и номера строк выводятся, но указывают не туда.

Отдельная страница: Что даёт отладочная информация и почему её обычно нет?
Программа работала годами и вдруг отказала — чья это ошибка?

Это особенность языка, и в спорах о качестве она объясняет больше всего. Правила C++ описывают не все ситуации: часть ошибок — обращение к освобождённой памяти, выход за границы массива, переполнение при вычислениях со знаковыми целыми — не приводит к немедленной остановке, потому что стандарт не определяет последствия.

На практике программа с такой ошибкой может годами работать правильно, а затем отказать после смены версии компилятора, изменения настроек оптимизации или другого объёма данных. В коде при этом ничего не меняли. Значит, вот что: «программа работала три года» не доказывает правильности, а отказ после обновления окружения не означает, что дефект внёс тот, кто обновлял.

Что может эксперт: установить, есть ли в коде ошибка такого класса — в том числе санитайзерами GCC и Clang или анализатором Valgrind, — и связан ли с ней отказ. Чего он не делает: не распределяет вину между сторонами, это решает суд.

Отдельная страница: Программа работала годами и вдруг отказала — чья это ошибка?
Можно ли установить причину аварийного завершения программы?

Обычно да, если программа оставила след. При аварийном завершении система может сохранить снимок памяти процесса: в Linux и macOS его называют core dump, в Windows — аварийным дампом. Важная оговорка: в Windows настройки по умолчанию сохраняют только цепочки вызовов, без содержимого памяти, поэтому полный дамп включают заранее.

По снимку восстанавливают, в какой функции произошёл отказ и с какими значениями работала программа. Но место падения не равно месту дефекта: порча памяти проявляется в другой части программы, иногда спустя минуты, поэтому цепочка вызовов — отправная точка, а не ответ.

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

Отдельная страница: Можно ли установить причину аварийного завершения программы?
Как доказать, что программа на C++ течёт по памяти?

Постепенный рост потребления памяти исследуют воспроизведением на стенде — отдельном компьютере, настроенном как рабочий, — под наблюдением средств учёта выделяемой памяти. Они показывают, какие участки программы запрашивают память и не возвращают её.

Главное — чтобы условия совпали с реальными: объём и характер данных, длительность работы, нагрузка. Утечка, заметная за сутки непрерывной работы, не проявится за десять минут, и наоборот — искусственно завышенная нагрузка даёт эффект, которого в эксплуатации нет.

Поэтому вывод о наличии утечки сопровождают указанием, при каком сценарии она воспроизведена, и оценкой того, наступают ли последствия при режиме эксплуатации, заявленном в техническом задании. Без этой привязки вывод неполон.

Отдельная страница: Как доказать, что программа на C++ течёт по памяти?
Как установить состав библиотек, если они вкомпилированы внутрь?

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

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

Дополнительные источники — файлы описания сборки и содержимое репозитория. Единого файла, закрепляющего версии всех зависимостей, в C++ долго не было; сейчас его дают менеджеры пакетов Conan и vcpkg, но пользуются ими не все проекты, и это ограничение тоже называют.

Отдельная страница: Как установить состав библиотек, если они вкомпилированы внутрь?
Как проверяют условия использования библиотек в программе на C++?

Эксперт устанавливает факты: какая библиотека какой версии использована, каким способом подключена — статически или динамически, — какой лицензией сопровождается и какие требования эта лицензия содержит. Распространённые лицензии открытого кода — MIT, BSD, Apache, GPL, LGPL — предъявляют разные требования, и текст каждой приводится в заключении.

Состав определяют по исходным текстам, файлам описания сборки и самой собранной программе; способ подключения — тоже устанавливаемый факт, и его фиксируют отдельно, потому что для ряда лицензий он имеет значение.

А какие последствия способ подключения влечёт для прав на программу, эксперт не решает. Это вопрос права: нарушены условия или нет и что из этого следует, определяет суд.

Отдельная страница: Как проверяют условия использования библиотек в программе на C++?
Исследуют ли прошивки станков и промышленных контроллеров?

Да, и это значительная часть споров по C++: станки с числовым программным управлением, производственные линии, приборы учёта, охранные и медицинские устройства. Программы для них исполняются на микроконтроллерах, программируемых логических контроллерах и промышленных компьютерах. Объект здесь двойной — устройство и записанная в него программа.

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

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

Отдельная страница: Исследуют ли прошивки станков и промышленных контроллеров?
Исходников нет, есть готовая программа: что можно сделать?

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

Чего по нему установить нельзя: авторства, качества исходного текста и соответствия требованиям, сформулированным в терминах устройства программы. Поведение собранной программы и свойства её кода — разные предметы, и вывод о первом не переносится на второе.

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

Отдельная страница: Исходников нет, есть готовая программа: что можно сделать?
Программу нельзя запустить без оборудования: как её проверят?

Способ проверки выбирают под требование, а запуск целиком нужен не всегда. Часть требований проверяется чтением исходного текста, если он есть и если требование сформулировано в терминах устройства программы. Часть — сборкой и запуском на стенде, воспроизводящем условия эксплуатации.

Часть проверок выполняют на самом оборудовании. Это работа на производственном объекте: её согласуют с эксплуатирующей организацией — состояние оборудования, окно работ, допуск, порядок на случай незапланированной остановки, — а подключение выполняет её персонал.

Если ни один способ не применим, эксперт указывает, какого объекта или каких условий не хватило, и оставляет вопрос без ответа. Это самостоятельный результат: он показывает суду, чего именно недостаёт, вместо того чтобы подменять проверку рассуждением.

Отдельная страница: Программу нельзя запустить без оборудования: как её проверят?
Как отличить заимствование кода на C++ от неизбежных совпадений?

Вычитанием общего основания. Совпадения между двумя проектами на C++ неизбежны и сами по себе ничего не доказывают: стандартная библиотека, сторонние библиотеки вроде Boost и Qt, заголовочные файлы поставщиков оборудования, сгенерированный код и типовые конструкции языка будут одинаковыми у независимых разработчиков.

Поэтому из сравнения сначала исключают всё перечисленное и результат автоматического форматирования, а затем сопоставляют остаток. Значимыми считают совпадения, которые общим основанием не объясняются: одинаковые опечатки и комментарии, идентичные имена служебных величин, повторяющаяся структура нестандартных решений.

Каждое такое совпадение проверяется вручную, а не принимается по проценту сходства, выданному инструментом. Подробно эта задача разобрана на странице экспертизы плагиата исходного кода.

Отдельная страница: Как отличить заимствование кода на C++ от неизбежных совпадений?
Как считают объём работ по проекту на C++?

Не по всему каталогу проекта. В него входят стандартная и сторонние библиотеки, заголовочные файлы поставщиков оборудования, сгенерированный код, тесты и артефакты сборки — ничего из этого не относится к работе подрядчика в том смысле, в каком её считают в споре о деньгах.

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

Полученная величина — технический факт, а не сумма: строка сложного алгоритма и сотня строк однотипного описания структур несопоставимы по трудозатратам. Если спор о цене, вопрос о стоимости ставят отдельно — его решает экспертиза объёма и стоимости работ, при необходимости с участием экономиста.

Отдельная страница: Как считают объём работ по проекту на C++?
Можно ли установить, когда написана спорная версия программы?

Частично. Полной картины не будет, но период обычно удаётся обосновать по совокупности источников: записям сервера сборки, датам выпуска установочных комплектов, служебным сведениям внутри исполняемых файлов, переписке с вложениями, актам и накладным на поставку оборудования с записанной программой.

История системы контроля версий помогает, но одной её мало: даты в ней задаются свободно штатными средствами, и опираться на них без подтверждения нельзя. То же относится к дате сборки внутри файла — она определяется настройками.

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

Отдельная страница: Можно ли установить, когда написана спорная версия программы?
Что нужно передать для исследования программы на C++?

Основной комплект: исходные тексты со всеми вспомогательными файлами и описанием сборки, репозиторий с полной историей, сведения о сборочной среде, используемые библиотеки с версиями, исполняемые файлы спорной версии и, если сохранилась, отладочная информация к ним.

К этому добавляют следы выполнения: снимки памяти при аварийных завершениях, журналы самой программы и системные журналы за спорный период, записи сервера сборки. Если спор о встроенной программе — прошивку и сведения об устройстве.

Из документов нужны техническое задание с приложениями, договор, акты, переписка сторон, задачи в системе учёта и документы на приобретение коммерческих библиотек и инструментов. Чего не хватает — скажем после первичного разбора; часть недостающего запрашивают через суд.

Отдельная страница: Что нужно передать для исследования программы на C++?
Как передать исходники и сборочную среду безопасно?

Материалы по C++ объёмнее, чем по другим языкам: образ сборочной среды и снимки памяти измеряются десятками гигабайт, поэтому канал и объём согласуют заранее.

В исходных текстах и настройках сборки нередко оказываются ключи подписи выпусков, пароли к хранилищам пакетов и учётные данные сервера сборки. Вычищать их из копии нельзя: это изменит объект. Материалы передают как есть, по защищённому каналу и ограниченному кругу лиц, а всё, что открывает доступ, после передачи меняют. Отдельно — ключ подписи выпусков: у другой стороны он превращается в возможность выпустить сборку от вашего имени.

Соглашение о конфиденциальности связывает эксперта, но не участников дела: материалы, поступившие в суд, доступны сторонам, и закрытое заседание этого не меняет — оно закрывает зал от посторонних, а не дело от оппонента. Если раскрытие неприемлемо, обсудите с юристом другие пути: ограничить объём передаваемого вопросами и просить об исследовании на вашей территории, без вывоза носителей.

Отдельная страница: Как передать исходники и сборочную среду безопасно?
Как понять заранее, что даст исследование программы на C++?

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

Если нужен документ, а не разговор, оформляется письменная консультация или справка специалиста — это отдельная платная услуга, и путать её с бесплатным разбором не стоит.

Гарантировать заранее содержание будущих выводов нельзя: по C++ особенно, потому что многое зависит от того, уцелела ли сборочная среда и сохранилась ли отладочная информация.

Отдельная страница: Как понять заранее, что даст исследование программы на C++?
Как сформулировать вопросы эксперту по программе на C++?

Вопрос работает, когда в нём назван объект и назван проверяемый критерий. Объект здесь — архив с контрольной суммой либо конкретный исполняемый файл с указанием, откуда он получен; критерий — пункт технического задания или иной документ.

Полезно ставить вопросы раздельно: отдельно о том, исходный ли это текст спорной программы, отдельно о соответствии заданию, отдельно о причине отказа. И стоит предусмотреть ответ «на представленных материалах не проверяется» — по C++ это частый и содержательный результат.

Формулировки вроде «качественно ли выполнены работы» непроверяемы, а просить эксперта оценить достаточность доказательств нельзя — это функция суда. Помощь с формулировками возможна до назначения экспертизы.

Отдельная страница: Как сформулировать вопросы эксперту по программе на C++?
Судебная экспертиза или внесудебное исследование программы?

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

Внесудебное исследование выполняется по договору со стороной: материалы передаёт заказчик, предупреждения об уголовной ответственности нет. Методы и требования к описанию объектов при этом те же, и такое исследование используют, чтобы оценить перспективу до иска или обосновать ходатайство о назначении экспертизы.

После назначения судебной экспертизы порядок общения меняется: назначенный эксперт не принимает материалы от одной стороны, а доступ к оборудованию согласуется через назначивший орган.

Отдельная страница: Судебная экспертиза или внесудебное исследование программы?
Что влияет на стоимость и срок исследования программы на C++?

Прежде всего — в каком виде дошёл объект. Исходные тексты вместе со сборочной средой разбираются предсказуемо; один исполняемый файл без исходников и без отладочной информации превращает чтение программы в отдельную работу, а защищённая от изучения сборка увеличивает эту работу ещё в разы.

Второе — воспроизводима ли сборка: при известных и доступных версиях инструментов стенд поднимается за часы, при утраченной среде её восстановление становится задачей с неопределённым результатом. Третье — нужно ли оборудование: проверки на стенде и на промышленной установке заказчика различаются и по трудоёмкости, и по организации.

Дальше обычное: объём спорного контура, число проверяемых требований, количество вопросов и необходимость смежных специалистов. Ориентир — от 100 000 ₽ и от 10 рабочих дней.

Отдельная страница: Что влияет на стоимость и срок исследования программы на C++?
Как рецензируют заключение по программе на C++?

Проверяют не выводы, а путь к ним. Первое — объекты: назван ли конкретный архив с контрольной суммой или конкретный исполняемый файл с указанием происхождения. Если объект описан как «программа заказчика», проверить исследование невозможно.

Второе — как сделан вывод о совпадении сборок. Утверждение «файлы не совпадают, значит передан не тот исходный код» неверно: разные настройки сборки дают разный машинный код при одинаковом тексте, и рецензент смотрит, измерял ли эксперт уровень шума контрольными сборками. Третье — сверена ли отладочная информация с идентификатором спорной сборки и разобраны ли альтернативные объяснения отказа.

Отдельно смотрят, не вышел ли эксперт за пределы вопросов и своей компетенции: не распределил ли вину, не дал ли правовой оценки лицензий. Подробнее — на странице рецензии на заключение о процессе разработки.

Отдельная страница: Как рецензируют заключение по программе на C++?
Обращение в организацию

Сначала опишите задачу и имеющиеся материалы

Для первого обращения достаточно описания. Небольшой доступный документ можно приложить, если вы вправе передать его через форму; конфиденциальный исходный код и доступы передают согласованным способом. Бесплатно уточним профиль и комплект, не анализируя код.

Описать задачу