Використання cxx у Chromium

У Chromium ми визначаємо незалежний #[cxx::bridge] mod для кожного листового вузла, де ми хочемо використовувати Rust. Зазвичай у вас буде по одному модулю для кожної rust_static_library. Просто додайте

cxx_bindings = [ "my_rust_file.rs" ]
   # список файлів, що містять #[cxx::bridge], не всі вхідні файли
allow_unsafe = true

до вашої існуючої цілі rust_static_ibrary разом з crate_root та sources.

C++ заголовки будуть згенеровані в доцільному місці, тому ви можете просто

#include "ui/base/my_rust_file.rs.h"

У //base ви знайдете деякі утиліти для перетворення типів Chromium C++ у типи CXX Rust --- наприклад SpanToRustSlice.

Студенти можуть запитати --- навіщо нам все ще потрібно allow_unsafe = true?

Загальна відповідь полягає у тому, що жоден C/C++ код не є "безпечним" за звичайними стандартами Rust. Виклик C/C++ з Rust може призвести до довільних дій з пам'яттю та поставити під загрозу безпеку власних структур даних Rust. Наявність занадто unsafe ключових слів у взаємодії C/C++ може погіршити співвідношення сигнал/шум такого ключового слова, що є суперечливим, але строго кажучи, внесення будь-якого стороннього коду у бінарний файл Rust може спричинити неочікувану поведінку з точки зору Rust'у.

Вузька відповідь міститься на діаграмі у верхній частині цієї сторінки --- за завісою CXX генерує unsafe та extern "C" функції Rust так само, як ми робили це вручну у попередньому розділі.