Создание воспроизводителя багов

Создание воспроизводителя багов

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

Воспроизведение простых багов

Если вы сообщаете о баге, связанном с некоторым компонентом Symfony, используемом вне фреймворка Symfony, то достаточно поделиться небольшим PHP-скриптом, который при выполнении отображает баг:

1
2
3
4
5
6
7
8
9
10
11
12
13
// Для начала, выполните "composer require symfony/validator"
// Далее, выполните этот файл:
<?php
require_once __DIR__.'/vendor/autoload.php';
use Symfony\Component\Validator\Constraints;

$wrongUrl = 'http://example.com/exploit.html?<script>alert(1);</script>';
$urlValidator = new Constraints\UrlValidator();
$urlConstraint = new Constraints\Url();

// URL неправильный, так что var_dump() должен отобразить ошибку, но он вместо этого
// отображает "null", так как нет контекста для построения нарушения валидатора
var_dump($urlValidator->validate($wrongUrl, $urlConstraint));

Воспроизведение сложных багов

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

  1. Создайте новый проект:
1
$ composer require symfony/skeleton bug_app
  1. Теперь вы должны добавить минимальное количество кода, чтобы воспроизвести баг. Это самая сложная часть и она разъясняется больше далее.
  2. Добавьте и зафиксируйте свои изменения.
  3. Создайте новое хранилище на GitHub (дайте ему любое имя).
  4. Следуйте инструкциям на GitHub, чтобы добавить удалённый origin к вашему локальному проекту и закрепите его.
  5. Добавьте комментарий к вашему исходному заявлению о проблеме, чтобы поделиться URL вашего отвевтлённого проекта (например, https://github.com/YOUR-GITHUB-USERNAME/symfony_issue_23567) и, если необходимо, объясните шаги для воспроизведение (например, "перейдите по этому URL", "заполните эти данные в форме и отправьте её" и т.д.)

Добавление минимально возможного количества кода

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

  1. Не редактируйте никакие опции конфигурации Symfony по умолчанию.
  2. Не копируйте исходный код вашего приложения и не используйте ту же структуру пакетов, контроллеров, действий и т.д., как в вашем исходном приложении.
  3. Создайте простой контроллер и добавьте ваше определение маршрутизации, отображающее баг.
  4. Не создавайте и не изменяйте любой другой файл.
  5. Выполните composer require server и используйте команду server:run, чтобы перейти по новому маршруту и увидеть, появляется ли баг.
  6. Если вы видите баг, то вы закончили и уже можете делиться кодом с нами.
  7. Если вы не видите баг, то вам нужно продолжать делать маленькие изменения. Например, если ваш исходный маршрут был определён, используя XML, забудьте о предыдущем маршруте и определите его используя XML. Или может ваше приложение регистрирует некоторые слушатели событий и именно в этом заключается баг. В таком случае, добавьте слушатель событий, схожий с вашим настоящим приложением, чтобы увидеть, сможете ли вы найти баг.

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