Panduan ini menerangkan cara menyumbang kepada teras PHP dengan menetapkan pepijat. Kami akan memberi tumpuan kepada aliran kerja, dengan menganggap pemahaman asas mengenai versi C dan PHP. Penyerahan ciri baru berada di luar skop artikel ini.
Konsep Utama:
- Versi LifeCycle Versi PHP: Versi PHP kecil dibebaskan setiap tahun, dengan 3 tahun sokongan (2 tahun sokongan aktif, 1 tahun sokongan keselamatan sahaja). Memahami ini penting untuk mensasarkan pembetulan pepijat.
- aliran kerja penetapan bug: Pembetulan harus menargetkan versi tertua yang disokong versi yang terjejas. Pemaju teras PHP kemudian akan menggabungkan pembetulan ke atas ke versi yang lebih baru.
- Proses penetapan pepijat: Ini melibatkan: Mengesahkan bug, pembiakan tempatan, mencipta ujian, debugging, pengekodan pembetulan, melakukan perubahan, dan mengemukakan permintaan tarik (PR).
menyelesaikan bug: contoh langkah demi langkah
Mari Betulkan Bug #71635 (Segfault dalam
Apabila tiada tarikh akhir ditetapkan). DatePeriod::getEndDate()
- Pengesahan: Cepat periksa jika pepijat boleh direproduksi menggunakan 3V4L (kod ujian alat merentasi pelbagai versi PHP). Ini membantu mengenal pasti versi yang terjejas.
Pengeluaran semula tempatan: - garpu , klon itu, dan kemas kini kepada siaran terkini. Semak cawangan yang paling rendah, disokong aktif
php/php-src
cawangan (mis., Dalam kes ini).
php-5.6
git checkout -b fix-dateperiod-segfault upstream/php-5.6
Salin selepas log masuk
Membina dan menghasilkan semula: - Bina PHP dan jalankan skrip (mis., ) Menghasilkan Segfault:
segfault.php
<?php
$period = new DatePeriod(new DateTimeImmutable("now"), new DateInterval("P2Y4DT6H8M"), 2);
var_dump($period->getEndDate());
?>
Salin selepas log masuk
sapi/cli/php -n segfault.php
Salin selepas log masuk
Buat ujian:
Buat fail ujian - (dalam ) untuk mengautomasikan pengesahan bug:
bug71635.phpt
ext/date/tests/
Jalankan ujian:
--TEST--
Bug #71635 (segfault in DatePeriod::getEndDate() when no end date has been set)
--FILE--
<?php date_default_timezone_set('UTC');
$period = new DatePeriod(new DateTimeImmutable("now"), new DateInterval("P2Y4DT6H8M"), 2);
var_dump($period->getEndDate());
?>
--EXPECT--
NULL
Salin selepas log masuk
make test TESTS=ext/date/tests/bug71635.phpt
Debugging:
Gunakan debugger (LLDB atau GDB) untuk mengenal pasti punca akar. Backtrace akan menentukan kod yang bermasalah. -
Kod FIX: - Ubah suai kod untuk mengendalikan penunjuk null. Sebagai contoh, tambahkan cek sebelum dereferencing
.
-
ujian dan komit: menjalankan semula ujian (). Sebaik sahaja berjaya, lakukan perubahan. make test
-
Hantar PR: Kirim permintaan tarik terhadap cawangan yang sesuai . php/php-src
Kesimpulan:
Memperbaiki pepijat teras PHP adalah sumbangan yang berharga yang memerlukan hanya pengetahuan asas C. Ia menyediakan pengalaman pengaturcaraan praktikal dan membantu meningkatkan PHP. Dengan beribu -ribu laporan bug terbuka, terdapat banyak peluang untuk terlibat.
Soalan Lazim (Soalan Lazim): (Ini diringkaskan untuk keringkasan)
- Bermula: Sediakan persekitaran pembangunan PHP, klon kod sumber, penyusunan, ujian, dan pelajari PHP internals.
- pelaporan bug: Gunakan sistem pengesanan pepijat php, memberikan deskripsi terperinci dan kes ujian.
- Debugging: Gunakan Xdebug atau alat debug lain.
- pepijat biasa: sintaks, logik, dan kesilapan runtime; menghalang mereka melalui kod bersih dan ujian menyeluruh.
- Sumbangan bukan pengekodan: Laporkan bug, menulis/menterjemahkan dokumentasi, membantu dengan laman web, mengambil bahagian dalam komuniti.
- ujian: Gunakan phpunit untuk ujian unit dan tulis kod yang boleh diuji.
- PHP Senarai Mel Mailing: melanggan dan mengambil bahagian dalam perbincangan.
- Tetap dikemas kini: Gunakan laman web PHP, media sosial, surat berita, dan komuniti.
- Amalan Terbaik: Nama -nama yang bermakna, komen, gaya yang konsisten, elakkan global, pengendalian ralat, sanitisasi input.
- Meningkatkan Kemahiran: Praktik, Projek, Cabaran, Sumbangan Sumber Terbuka, Buku, Kursus, Persidangan.
Atas ialah kandungan terperinci Menyumbang kepada PHP: Cara Memperbaiki Pepijat di Teras PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!