Khi compiler bắt đầu trưởng thành, chúng tôi bắt đầu viết các pass tối ưu hóa IR sơ khai (như constant folding ở Chương 3). Nhưng tối ưu hóa là vùng đất chứa nhiều cạm bẫy nhất. Một pass tối ưu hóa sai có thể âm thầm biến đổi cấu trúc IR hợp lệ thành dị dạng mà không báo lỗi, dẫn đến việc sinh ra mã native bị hỏng hành vi.
Sprint 110 tập trung vào việc gia cố bức tường phòng thủ IR Verifier (irVerify).
Chúng tôi xây dựng một bảng bất biến (invariant table) chi tiết và viết các bài kiểm tra phủ định (negative IR tests). Negative IR là việc chúng tôi cố tình dựng lên các đoạn IR malformed (lỗi kiểu toán hạng, jump sai block, hoặc đọc biến chưa khai báo) và bắt verifier phải chặn đứng chúng.
Malformed IR -> [ Verifier ] -> ERROR (chặn đứng trước backend)
Tôi đã tự viết các tool helper để tiêm lỗi (fault injection) vào cấu trúc IR ngẫu nhiên và kiểm chứng xem Verifier có bắt được không. Nếu một đoạn IR dị dạng lọt qua verifier tới backend, đó là thất bại của hệ thống an toàn. Verifier phải hoạt động như một cái gate đỏ tuyệt đối. Hardening verifier giúp tôi ngủ ngon hơn mỗi khi refactor backend LLVM. Nó đảm bảo rằng bất kể frontend hay optimizer có làm gì sai, lỗi sẽ bị bắt giữ ngay lập tức tại ranh giới IR, không cho phép mã độc hại có cơ hội được vật chất hóa thành binary thực thi.
Bình luận (0)
Đang tải bình luận...