Microsoft Checked C
В исследовательском центре Microsoft наконец-то приняли решение поделиться с разработчиками секретами проекта Checked C, выложив его исходники в открытый доступ: www.microsoft.com/en-us/research/project/checked-c
Основа
Итогов проекта Checked C с интересом ждали программисты во всем мире. Цель проекта заключалась в создании такого расширения языка Си, которое позволило бы писать максимально неуязвимые программы. В итоге появилась модифицированная версия языка программирования, позволяющая устранять проблемы, связанные с переполнением буфера, превышением границ массива и прочими нарушениями безопасности памяти.
В большей степени уязвимость такого рода характерна для С++ и С. Так как эти языки позволяют разработчику напрямую обращаться к произвольным адресам, пересчитывая вручную значения указателей. Таким образом, разработчик возлагает на себя довольно непростую задачу анализа этих вычислений и проверки корректности выполняемых операций.
В результате, даже в самой, казалось бы, отработанной до мелочей программе появляются баги. Их трудно заметить и устранить, но они становятся причиной некорректной работы и разноплановых сбоев. В худшем случае ошибками могут воспользоваться злоумышленники.
Checked C позволяет в принципе устранить проблемы, связанные с механизмом доступа к памяти и указателями. Используя новые средства, разработчик может проверять указатели на безопасность, возвращаясь к небезопасным типам в случае необходимости. Стоит отметить, что тестировать допустимость операций с памятью без проблем удается как вовремя работы над программой, так и на этапе ее компиляции.
Совместимость
Если вы уже проходили обучение программированию, то знаете, что любая из существующих версий языков, сталкивается с такой проблемой как обратная совместимость. Специалисты Microsoft предусмотрели и этот момент. Изменения, вносимые Checked C, совершенно не влияют на корректность работы программ, созданных на Си. По крайней мере, пока никаких вопросов в этой связи не возникало.
Однако, как обстоят дела с еще одним немаловажным обстоятельство внедрения нового расширения – изменением инструментария? В этом вопросе решение Microsoft можно назвать вполне сносным. Так как инженеры компании внедрили в Checked C широко используемый компилятор LLVM.
Новые разновидности указателей от Checked C
-
span<T> - указывает на величину массива, предупреждая выход за его границы во время исполнения программы;
-
array_ptr<T> - указывает на элемент массива, состоящего из значений Т. Допускает адресную арифметику. При этом контролировать результат вычислений разработчик должен сам, чтобы они не выходили за пределы массива;
-
ptr<T> - не требует проверки выхода за пределы массива и не используется для вычисления новых адресов.