Topik temu duga representatif

Temu duga pengekodan: Bagaimanakah anda akan melaksanakan diagnostik pemalsuan kod sumber Unicode?

PengekodanSukar
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Laksanakan diagnostik kod sumber yang mengesan kawalan bidi, pengecam yang mengelirukan (confusable), dan susunan paparan yang mengelirukan sambil mengekalkan komen dan rentetan pelbagai bahasa yang sah. Bagaimanakah anda memisahkan analisis leksikal (lexing), pemaparan (rendering), dan pelaporan?

Gesaan dan konteks

Satu repositori membenarkan pengecam bukan ASCII dan komen pelbagai bahasa. Satu perubahan mengandungi kawalan bidi atau pengecam yang mengelirukan secara visual, namun pemapar teks biasa memaparkan susunan yang mengelirukan. Reka bentuk pengimbas yang mengesan risiko tersebut tanpa menolak komen dan rentetan sah dalam bahasa Arab, Ibrani, atau bahasa lain.

Perkara yang dinilai oleh penemu duga

  • Sama ada analisis leksikal, pemaparan dwiarah, dan diagnostik keselamatan merupakan peringkat yang berasingan.
  • Sama ada anda memahami atom kod sumber leksikal UTS #55 dan semantik paparan HL4-nya.
  • Sama ada anda menggunakan peraturan confusable dan sekatan UTS #39 dan bukannya menganggap setiap aksara bukan ASCII sebagai berbahaya.
  • Sama ada anda mengendalikan versi data Unicode, imbasan berperingkat (incremental), penemuan yang boleh dijelaskan, dan dasar positif palsu (false-positive).

Soalan penjelasan untuk ditanya

Mula-mula sahkan bahasa sasaran, versi pengkompil, skrip pengecam yang dibenarkan, dan bahasa komen; kenal pasti sama ada pengimbas dijalankan dalam editor, CI, atau platform pengehosan kod. Kemudian jelaskan sama ada penemuan memberikan amaran, menyekat penyerahan, atau memerlukan semakan, dan sama ada data Unicode lama atau kod yang tidak boleh dihuraikan mesti kekal disokong.

Jawapan 30 saat

Saya akan menggunakan peleksikal (lexer) bahasa sasaran untuk mendapatkan token, pengecam, rentetan, dan komen, kemudian merekodkan titik kod asal, kawalan arah, dan skrip bagi setiap atom. Paparan sumber mengikut struktur leksikal UTS #55 dan bukannya menganggap fail sebagai satu perenggan biasa. Diagnostik menggabungkan data sekatan dan confusable UTS #39, melaporkan kedudukan, peraturan, versi, dan perbezaan yang dipaparkan. Penemuan boleh memberi amaran secara lalai dan menyekat mengikut dasar repositori; teks asal dikekalkan supaya teks RTL yang sah tidak disalah anggap sebagai serangan.

Penjelasan terperinci langkah demi langkah

1. Tetapkan sempadan leksikal terlebih dahulu

Jangan gunakan pemprosesan bidi perenggan biasa aksara demi aksara. Literal berangka, pengecam, rentetan baris tunggal, dan kandungan komen membentuk atom; bahasa bersarang memerlukan sempadan daripada tatabahasa luar. Guna semula julat token pengkompil atau penghurai matang, dan turunkan taraf secara eksplisit kepada diagnostik konservatif apabila penghuraian gagal.

2. Tandakan kawalan bidi dan aksara yang boleh diabaikan secara lalai (default-ignorable)

Bagi setiap atom, rekodkan kawalan seperti RLO, LRO, PDF, RLI, LRI, FSI, dan PDI berserta skopnya. Laporan harus menunjukkan titik kod yang di-escape dan kedudukan asal, menghalang terminal atau halaman Web daripada menggunakan kawalan itu semula. Jangan memadamkannya secara membuta tuli kerana susun atur yang sah mungkin memerlukan kawalan arah.

3. Susun paparan sumber dengan UTS #55

UTS #55 mengesyorkan penggunaan protokol peringkat lebih tinggi HL4 pada struktur leksikal: susunan token mengikut sintaks bahasa, manakala rentetan, pengecam, dan komen ialah atom yang tidak boleh dibahagikan yang dipaparkan dengan sifat arahnya. Ini mengekalkan teks RTL yang boleh dibaca dan struktur kod yang boleh diaudit pada masa yang sama.

4. Gunakan peraturan pengecam dan confusable

Gunakan penormalan yang dibenarkan oleh bahasa, huruf besar/kecil, dan profil UAX #31 pada pengecam, kemudian gunakan UTS #39 untuk diagnostik skrip bercampur dan confusable. Jangan jadikan skeleton sebagai pengecam itu sendiri; ia adalah nilai perbandingan perantara bagi satu versi data Unicode dan berguna untuk mencari kemungkinan pertembungan (collision).

5. Tulis saluran paip pengimbasan terkecil

Pseudokod di bawah hanya menunjukkan sempadan peringkat; kod pengeluaran masih memerlukan peleksikal bahasa sasaran dan fail data Unicode:

typescript
type Atom = { kind: string; start: number; end: number; text: string };
type Finding = { code: string; start: number; end: number; detail: string };

function diagnose(source: string, atoms: Atom[], unicodeVersion: string): Finding[] {
  const findings: Finding[] = [];
  for (const atom of atoms) {
    findings.push(...scanBidiControls(atom));
    if (atom.kind === "identifier") {
      findings.push(...scanIdentifierConfusables(atom, unicodeVersion));
    }
  }
  return findings;
}

scanBidiControls harus mengekalkan titik kod kawalan dan skop; scanIdentifierConfusables harus mengembalikan penemuan skrip bercampur, tahap sekatan, atau pertembungan pengecam sedia ada. Peringkat diagnostik tidak seharusnya menulis semula kod sumber.

6. Kendalikan versi, cache, dan imbasan berperingkat

Tulis versi data Unicode, versi peleksikal bahasa, dan konfigurasi peraturan ke dalam setiap laporan. Simpan hasil token dalam cache mengikut kandungan fail dan versi peleksikal; binaan berperingkat mengimbas semula token dan pengecam yang terjejas dalam skop yang sama. Selepas peningkatan data Unicode, kira semula skeleton dan set pertembungan dan bukannya menggunakan semula entri cache lama.

7. Asingkan penemuan daripada dasar

Setiap penemuan hendaklah merangkumi fail, baris dan lajur, kod peraturan, titik kod asal, pemaparan yang kelihatan, dan petunjuk pemulihan. Lapisan dasar memilih amaran, sekatan, semakan, atau kebenaran; penemuan yang sama boleh mempunyai dasar yang berbeza dalam editor, CI, atau UI pengehosan kod. Log tidak boleh memaparkan kawalan yang tidak di-escape secara langsung.

Contoh jawapan berkualiti tinggi

Saya akan membahagikan pelaksanaan kepada peleksikal, analisis Unicode, pratonton paparan, dan pelaporan dasar. Peleksikal mengembalikan julat tepat untuk token, pengecam, rentetan, dan komen; kawasan yang tidak boleh dihuraikan ditandakan sebagai tidak pasti (uncertain) dan bukannya diberikan sempadan aksara. Analisis Unicode merekodkan Bidi_Control, set skrip, profil penormalan, dan hasil confusable UTS #39 bagi setiap atom. Pratonton mengekalkan susunan sintaks token menggunakan pendekatan UTS #55 HL4, menggunakan peraturan bidi di dalam setiap atom, dan menunjukkan titik kod yang di-escape bersama-sama pemaparan. Laporan membawa versi data Unicode, versi peleksikal, kod peraturan, dan lokasi; dasar memilih amaran atau sekatan mengikut risiko medan. Skeleton versi yang sama boleh membantu mencari pertembungan pengecam, tetapi ia bukan nama pengguna atau cincangan (hash) yang stabil. Kunci cache merangkumi kandungan fail, versi bahasa, dan versi Unicode, dan peningkatan mencetuskan pengiraan semula kelompok. Ujian merangkumi komen RTL, kawalan di dalam rentetan, bahasa bersarang, pengecam skrip bercampur, kegagalan penghuraian, pengeditan berperingkat, dan perbezaan merentasi pemapar terminal dan Web.

Kesilapan biasa dan pendekatan yang gagal

  • Memaparkan setiap aksara dari kiri ke kanan, menjadikan komen dan rentetan RTL yang sah tidak dapat dibaca.
  • Menyekat setiap aksara bukan ASCII dan merosakkan bahasa yang sah serta pengecam antarabangsa.
  • Menggantikan peleksikal dengan ungkapan nalar (regex), kehilangan konteks sama ada kawalan berada dalam rentetan, komen, atau pengecam.
  • Hanya menyimpan teks yang dibersihkan dan kehilangan titik kod asal serta kedudukan audit.
  • Membandingkan skeleton yang dihasilkan oleh versi Unicode yang berbeza tanpa pelan migrasi.

Soalan susulan dan respons

Mengapa tidak memadamkan setiap aksara Bidi_Control?

Sesetengah teks yang sah memerlukan kawalan arah, dan pemadaman mengubah apa yang dilihat oleh pengguna. Sekat atau escape aksara tersebut dalam kod sumber mengikut dasar bahasa; laporkan konteks dan kekalkan yang asal dalam komen dan rentetan.

Apakah yang perlu dilakukan oleh pengimbas apabila analisis leksikal gagal?

Kembalikan julat tidak pasti yang eksplisit, jalankan diagnostik kawalan dan titik kod yang konservatif, dan jangan mendakwa bahawa kawasan tersebut selamat. CI boleh memerlukan semakan sehingga penghurai menyokong bahasa tersebut dengan tepat.

Bagaimanakah anda membuktikan bahawa kod pelbagai bahasa tidak ditandakan secara salah?

Gunakan komen RTL yang sah, rentetan, dan pengecam yang dibenarkan sebagai kes positif, dan RLO/LRO, skrip bercampur, dan pertembungan confusable sebagai kes negatif. Bandingkan susunan logik, susunan visual, dan lokasi laporan merentasi pelbagai editor, terminal, dan pemapar Web.

Sumber awam

Soalan berkaitan

Alat temu duga berkaitan

Gunakan Tangkapan Skrin untuk gesaan pengekodan

Tangkap soalan, kemudian selesaikan kekangan, penyelesaian, kod, kes pinggir dan kerumitan mengikut urutan.

Lihat alat