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