Mapeando o custo e a fronteira de segurança do Rust no território de data races em algoritmos de controle
Data race; Segurança de Memória; Sistemas de Controle; Rust; Sistemas Embarcados
Em controle digital de malha fechada, não cumprir o requisito de tempo do período de controle (perder deadline) pode desestabilizar o sistema por completo, causando acidentes graves. A natureza do controle digital exige estados compartilhados: seja na aquisição de dados, seja na alteração de parâmetros feita pelo usuário, seja na atuação do sinal de controle. Os estados compartilhados acessados por diversos contextos, onde pelo menos um deles realiza uma escrita e pelo menos um acesso é não sincronizado, levam a um data race. Em código com data race, o comportamento é indefinido, podendo levar o controle digital a perder deadlines. O estado da arte hoje na implementação de controle digital, em sistemas embarcados, envolve C+MISRA+Sanitizers para evitar data races. Entretanto este método depende da disciplina do desenvolvedor e de detectar data races exercitados em tempo de execução. Com a linguagem Rust, essas garantias são movidas do desenvolvedor para o compilador e os data races não são mais detectados em tempo de execução, mas sim eliminados em tempo de compilação, através do sistema de tipos do Rust (Send/Sync e borrow checker). Todavia, o Rust exige uma sincronização forçada a qual possui um custo. Também é desconhecido quais resquícios de unsafe ainda permanecem no Rust. Deste modo, qual a fronteira entre safe e unsafe nos padrões de data race, no domínio de algoritmos embarcados de controle, e qual o custo das garantias do Rust? Neste trabalho, é proposta uma taxonomia para classificar os padrões de data race presentes nos algoritmos de controle. Após isso, a fronteira entre safe e unsafe nestes padrões é caracterizada. Além disso, é catalogado o espaço de design das garantias que tornam o data race inexprimível. Também é construído o veículo de experimentos: Aule, uma biblioteca de controle construída para instanciar os algoritmos de controle utilizados nos experimentos. Atualmente, Aule contém a base principal para a construção dos experimentos em uma planta física (pêndulo invertido), com os blocos de sincronização em desenvolvimento. Também está presente neste trabalho um panorama comparativo do ecossistema open-source do Rust para bibliotecas de controle. Por fim, é mostrado neste trabalho um caso demonstrativo de recusa do compilador Rust safe, quando o código possui data race.