"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.