Поставляется ли эта «наиболее востребованная» функция Go с риском безопасности?

Поставляется ли эта «наиболее востребованная» функция Go с риском безопасности?



Идти

Go выпустила версию 1.18 в марте 2022 года. Универсальное программирование позволяет вам писать функции, которые могут принимать и возвращать более гибкие типы.

Язык программирования Go сильно изменился с тех пор, как он был впервые опубликован в 2009 году. Go 1.18 был долгожданным выпуском из-за поддержки дженериков и многих других важных обновлений. Go выпустила версию 1.18 в марте 2022 года. Универсальное программирование позволяет вам писать функции, которые могут принимать и возвращать более гибкие типы. До поддержки дженериков вам нужно было явно указать типы параметров и возвращаемые типы. Простейшая форма дженериков позволяет указывать нетипизированные параметры:

Функция PrintAnything[T any](вещь Т) {

Fmt.Println(вещь)

}

Но дженерики предлагают гораздо больше возможностей, чем просто это. Вы можете объявить практически любую комбинацию и степень детализации типов для параметров. Например, вы можете использовать пакет ограничений для написания функции, которая работает с любым значением, которое вы можете заказать. Это включает в себя int, числа с плавающей запятой и строки.

В текущей реализации Generics в версии 1.18 каждый вызов универсальной функции во время выполнения будет прозрачно получать в качестве первого аргумента статический словарь с метаданными об аргументах, передаваемых функции. Словарь будет помещен в регистр AX для AMD64 и в стек на платформах, где компилятор Go еще не поддерживает соглашения о вызовах на основе регистров. Полная информация о реализации этих словарей подробно описана в вышеупомянутом проектном документе, но в качестве резюме они включают в себя все необходимые метаданные типа для передачи аргументов в дополнительные универсальные функции, для преобразования их из/в интерфейсы и, что наиболее важно, для нас, чтобы вызывать методы на них. Правильно, после шага мономорфизации сгенерированная форма функции должна принимать в качестве входных данных среды выполнения таблицы виртуальных методов для всех своих универсальных аргументов. Интуитивно мы можем предположить, что, хотя это значительно уменьшает количество генерируемого уникального кода, такая широкая мономорфизация не поддается де-виртуализации, встраиванию или какой-либо оптимизации производительности.

READ  У Twitter есть недостатки в безопасности, и Илону лгут, утверждает разоблачитель

На самом деле может показаться, что для подавляющего большинства кода Go сделать его универсальным означает сделать его медленнее. Но прежде чем мы начнем погружаться в глубокую яму отчаяния, давайте запустим несколько тестов, посмотрим на какую-нибудь сборку и проверим некоторые поведения.

Сообщение Поставляется ли эта «наиболее востребованная» функция Go с угрозой безопасности? впервые появился в Analytics Insight.



Source link