Разработчики из компании Apple, ну вы поняли, выкатили какую-то новенькую доработку компилятора — «-fbounds-safety». Как выясняется, штука эта, по-видимому, предназначена для проверки того, чтобы работа с массивами не выходила за допустимые рамки. Вроде бы особо полезная вещь! Apple на полном серьёзе прокачивают свой LLVM, добавляя туда возможности для, скажем так, более аккуратного обращения с данными. Что забавно, эта штуковина тесно связана с пользой для компиляторов Swift и других системных инструментов от этих ребят. Так что, вы сами понимаете, здесь речь явно не о пустячной какой-то штуке.
Как работает и чему помогает
Суть, на первый взгляд, очень простая: расширение «-fbounds-safety» типа берёт и проверяет, чтобы программисты не накрутили доступов к частям массива, которые им вообще не принадлежат. Используется какой-то там заголовочек под названием ptrcheck.h, он, судя по всему, делает магию, отслеживая, что диапазоны доступа не выходят за пределы. Если вы знаете, как работают массивы и указатели, то вот вам лайфхак: штука сможет засечь ошибку и мягко (а может быть, и не очень) сказать, что ты куда-то не туда полез. Полезно? На самом деле не то что полезно, а слегка, ну, прям необходимость для тех, кто постоянно возится с этой динамической памятью.
Кстати, одним из главных игроков тут являются так называемые «широкие указатели». Это как обычные указатели, но, по правде говоря, прокачанные. Они таскают с собой не просто ссылку на место, но и дополнительные данные для проверки — чтобы можно было понять, где граница, и не поломать всё что можно. При этом сам бинарный интерфейс приложений (если проще, то итоговая работа кода) остаётся в норме. Никакие там старые программульки не крэшнутся от этого нового внедрения.
Почему это может быть в некотором смысле круто
Ну, как бы функция звучит перспективно, потому что берёт за шкирку многие баги программистов и вроде как не даёт им спокойно выйти за пределы массива. Длина массива известна? Программа сразу пометит это место как безопасное. Чуть-чуть промахнулся с доступом? Лови проверочку! Это, конечно, полностью от глупостей не спасёт, но намного уменьшим варианты, где можно было бы козявить что-то в коде.
Прямо на лету компилятор подставляет проверки — подтык тут, подтык там. Например, если вы решили написать указатель, который указывает непонятно куда (да, у всех бывают такие дни), система сразу это спалит. А чтобы эта схема вообще реально заработала, добавляется немного «чудесной магии», то есть спецовые аннотации в код. Тогда всё чётко заработает.
Детально про аннотации
Если вдруг вам стало интересно, с чем же придётся работать, вот несколько примеров аннотаций, которые вы встретите:
- __counted_by(N) — понятнее говоря, это заглядывание в будущее: типа массив имеет длину N, и вот на неё всё и завязано.
- __sized_by(N) — аналогично говорит: эй, массив такого-то размера, проверьте это.
- __null_terminated — специальный прикол, который объявляет нулевой элемент концом массива.
- __unsafe_indexable — ну это для любителей треша: проверить тех, кто прям очень не любит ограничения.
Коротенький примерчик разметки
#include
void init_buf(int *__counted_by(n) p, int n) {
for (int i = 0; i < n; ++i)
p[i] = 0; // автоматическая проверка сгенерирует "if (i < 0 || i >= n) trap();"
}
Вроде бы как несложно написать такую разметку, а проверки упростят жизнь тем, кто работает даже с такой штукой, как динамический массив. Случается же иногда, что ошибки где-нибудь в выделении памяти могут вылезти в самый неожиданный момент. А тут их, скорее всего, можно будет легко подпилить.
Чем можно удивиться в будущем
Ну что тут можно сказать. Инновация явно как минимум забавная. Даже несмотря на небольшой прирост производительности (там что-то около 5% в зависимости, конечно, от ситуации), многие программисты, по всей видимости, будут довольны тем фактом, что их работа становится чуть спокойнее. Меньше страха, что в какой-то момент адресный бардак утащит всё в непроглядную тьму. Ну, или не такую уж и тёмную, но багов там может быть просто море.
Вот теперь и вы чуть более-менее в курсе, как оно всё работает и зачем всё это придумали. Ну что ж, разработка идёт своим ходом, а вы можете разбираться, приживётся ли этому инструменту в реальном использовании!