Створення відтворювача багів

Дата оновлення перекладу 2025-01-11

Створення відтворювача багів

Основний репозиторій коду 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 create-project symfony/skeleton bug_app
  1. Додайте та зафіксуйте зміни, згенеровані Symfony.
  2. Тепер ви повинні додати мінімальну кількість коду, щоб відтворити баг. Це найскладніша
    частина, і вона буде пояснена трохи пізніше.
  3. Додайте і зафіксуйте ваші зміни.
  4. Створіть новий репозиторій на GitHub (дайте йому будь-яку назву).
  5. Дотримуйтесь інструкцій на GitHub, щоб додати віддалений репозиторій origin до
    вашого локального проекту і запустіть його.
  6. Додайте коментар до вашого оригінального звіту про проблему, щоб поділитися URL-адресою
    вашого форкованого проекту (наприклад, https://github.com/YOUR-GITHUB-USERNAME/symfony_issue_23567) і, якщо необхідно, поясніть кроки для відтворення (наприклад, "перегляньте цю URL-адресу", "заповніть ці дані у формі та надішліть їх" тощо).

Додавання мінімально можливої кількості коду

Ключ до створення відтворювача багів полягає в тому, щоб зосередитися виключно на функції, яка, як ви ви підозрюєте, не працює. Наприклад, уявіть, що ви підозрюєте, що баг пов'язаний з визначенням маршруту. Тоді, після створення вашого проекту:

  1. Не редагуйте жодних опцій конфігурації Symfony за замовчуванням.
  2. Не копіюйте код вашого оригінального додатку і не використовуйте ту саму структуру контролерів, дій тощо, як у вашому оригінальному додатку.
  3. Створіть невеликий контролер і додайте своє визначення маршрутизації, яке показує баг.
  4. Не створюйте і не змінюйте жодних інших файлів.
  5. Встановіть локальний веб-сервер, наданий Symfony та скористайтеся командою symfony server:start для переходу за новим маршрутом і перевірте, чи з' явиться баг.
  6. Якщо ви бачите баг, ви закінчили і можете поділитися кодом з нами.
  7. Якщо ви не бачите баг, ви повинні продовжувати вносити невеликі зміни. Наприклад, якщо ваш початковий маршрут був визначений за допомогою XML, забудьте про попередній маршрут і визначте маршрут за допомогою XML замість цього. Або, можливо, ваш додаток реєструє декілька слухачів подій, і саме в них і є баг. У такому випадку додайте слухача подій, схожого на ваш реальний додаток, щоб перевірити, чи зможете ви знайти баг.

Коротше кажучи, ідея полягає в тому, щоб продовжувати додавати невеликі та поступові зміни до нового проекту доки ви не зможете відтворити баг.