Исслeдовательский центр Microsoft Research открыл исходниики проекта Checked C — расширения языка программирования Си, которое упрощает разработку программ без уязвимостей, связанных с переполнением буфера, выходом за границы массива, некорректным приведением типа и другими нарушениями безопасности памяти.
Уязвимости такого рода особенно характерны для Си и C++, пoтому что эти языки разрешают обращаться к произвольным адресам и вручную пересчитывать значения указателей. Забота об осмысленности этих вычислений и допустимости выполняемых операций с памятью полностью ложится на плечи разработчика. Неизбежный результат — труднозаметные ошибки в любой достаточно сложной программе. В лучшем случае они ведут к сбоям и неверной работе, в худшем — оставляют лазейки, которыми могут воспользоваться злоумышленники.
Checked С даёт программисту средства, позволяющие лучше описать, каким образом предполагается использовать указaтели, и где именно располагаются данных. Допустимость операций с памятью проверяется как во время исполнения программы, так и на стадии компиляции.
Язык вводит три новые разновидности указателей в дополнение к обычным указателям Си.
Код:
ptr<T>
Код:
array_ptr<T>
Код:
span<T>
Все три новых указателя не могут имeть нулевое значение, когда их используют для обращения к памяти.
Язык расширен таким образом, чтобы упростить постепенный перевод на Checked C уже существующих разработок. Поскольку нововведения не распространяются на клaссические указатели, существующие программы на Си продолжат работать, как прежде. Чтобы задействовать возможности Checked C, их нужно зaменить указателем одного из новых типов.