Internships
Register
Copyright © 2000—2025 JetBrains s.r.o.

Расширение компилятора C# для проверки контрактов null-ссылок во время исполнения

Description

"The Billion Dollar Mistake" - так сэр Энтони Хоар охарактеризовал собственное изобретение из 1965 года, null-ссылку. Проблема существования null-ссылок в популярных языках программирования привела к появлению различных инструментов для борьбы с потенциальными разыменованиями null-ссылок, включая средства статического анализа кода. В экосистеме C#/.NET с проблемой null-ссылок борятся несколькими способами:

  • Разработчики вручную проверяют значения входных параметров во время исполнения и убеждаются в отсутствии null-ссылок. Проверки в коде тратят много времени разработчика и очень засоряют код, их приходится поддерживать при изменении сигнатур методов, а проблемы обнаруживаются только во время исполнения программы.

  • IDE-инструменты компании JetBrains, такие как ReSharper/Rider, имеют статический анализатор кода, выявляющий в пользовательских программах потенциально опасные операции разыменования. Анализатор в IDE ограничен временем работы, поэтому анализирует только видимый пользователю код, каждый метод по отдельности. Чтобы улучшать точность анализа и распространять между методами контракт (знание о безопасности разыменования или наоборот опциональности некоторого параметра/возвращаемого значения), пользователям предлагается аннотировать сигнатуры в коде специальными атрибутами [NotNull] / [CanBeNull].

  • Язык C# начиная с версии 8.0 имеет встроенный статический анализ (под именем "Nullable Reference Types"), очень похожий на анализ ReSharper/Rider. Пользователи языка могут включить опциональный анализ и получать от компилятора предупреждения о небезопасных разыменованиях. Для распространения контрактов между методами язык был расширен синтаксисом вида void M(string? canBeNull) - ? используется для уточнения типов сущностей, которые могут принимать null-значение, а все остальные сущности анализ считает не допускающими null-значения.

Проблема статических анализаторов - отсутствие null-разыменований во время исполнения не гарантируется на 100%, оба анализа ограничены в своих доказательных возможностях, пользователи могут игнорировать предупреждения IDE/компилятора и забывать их исправлять, а программы продолжают компилироваться и падать с NullReferenceException.

Задача стажировки заключается в разработке простого форка компилятора C#, который будет наделять семантикой [NotNull]-подобные аннотации - превращать аннотации в проверки null-ссылок, сообщающие о нарушении контракта во время исполнения. В результате должен получиться компилятор C#, который разработчики смогут легко подключить в свой проект (подменив стандартный) и получить дополнительные гарантии отсутствия null-ссылок во время исполнения, без засорения кода ручными проверками входных параметров.

По любым вопросам обращайтесь на почту alexander.shvedov@jetbrains.com или в telegram.

Requirements

  • Знание языка C# и основ разработки на платформе .NET, либо большое желание разобраться и какой-нибудь опыт изучения/модификаций компиляторов.
  • Желание разобраться со внутренней кухней компилятора C# (он написан на C#), фазами компиляций, анализом и трансформацией синтаксических/семантических деревьев, глубоко погрузиться в синтаксис и семантику языка C#.

Admission

Разработчики: Лето 2021

Mentor

Alexander Shvedov

Mentor's location

Remote

Product/Team

ReSharper

Tags

.NET
C#