Unity 6.3
0 онлайн 3 гостей 3 в системе
Вход

IL2CPP Проверки кода во время выполнения

Вы можете использовать атрибут [Il2CppSetOption] C# и его параметр Option для управления тем, какие проверки безопасности включает компилятор IL2CPP в генерируемый им код C++.

[Il2CppSetOption] атрибут не входит в стандартные открытые API редактора и движка Unity, но его исходный код поставляется отдельно вместе с вашей установкой Unity. Чтобы использовать [Il2CppSetOption] атрибут:

  1. В каталоге, в котором установлена версия Unity, перейдите в каталог Data\il2cpp на Windows или каталог Contents/Frameworks/il2cpp на macOS.
  2. Найдите исходный файл Il2CppSetOptionAttribute.cs.
  3. Скопируйте исходный файл в папку проекта Assets.

Для этого атрибута поддерживаются следующие параметры:

Свойство Описание По умолчанию
Нулевые проверки Рекомендуется оставить эту опцию включенной. Когда она отключена, IL2CPP генерирует C++ без проверки нулей и не будет вызывать управляемые исключения NullReferenceException. Это может повысить производительность во время выполнения, но попытки доступа к нулевым значениям не будут предотвращены, что может привести к непредвиденному поведению, включая сбои. Включено
Проверка границ массива Рекомендуется оставить эту опцию включённой. Когда отключена, IL2CPP генерирует C++ без проверки границ массива и не будет выводить управляемые исключения IndexOutOfRangeException. Это может повысить производительность во время выполнения, но позволяет коду обращаться к массиву по неверным индексам, что чревато некорректным поведением, включая чтение из произвольных участков памяти и запись в них. Чаще всего такие обращения проходят без видимых последствий и могут испортить состояние приложения без явных предупреждающих признаков, из-за чего ошибки становится очень трудно отлаживать. Включено
Деление на нулевое число Не отключайте эту опцию, если вам не нужно выполнять проверки деления на нулевой. При включении, IL2CPP генерирует C++, который содержит проверки деления на нулевой для деления целых чисел и вызывает управляемые исключения DivideByZeroException по мере необходимости. Если эта опция отключена, IL2CPP не отправляет проверки деления на нулевой для деления целых чисел в генерируемый код C++.

Эти проверки влияют на производительность во время выполнения.
Инвалиды

В следующем примере показано, как использовать атрибут [Il2CppSetOption]:

[Il2CppSetOption(Option.NullChecks, false)]
public static string MethodWithNullChecksDisabled()
{
    var tmp = new object();
    return tmp.ToString();
}

Атрибут [Il2CppSetOption] можно применять к сборкам, типам, методам и свойствам. Атрибут Unity использует атрибут из наиболее локальной области.

[Il2CppSetOption(Option.NullChecks, false)]
public class TypeWithNullChecksDisabled
{
    public static string AnyMethod()
    {
        // Unity doesn’t perform null checks in this method.
        var tmp = new object();
        return tmp.ToString();
    }

    [Il2CppSetOption(Option.NullChecks, true)]
    public static string MethodWithNullChecksEnabled()
    {
        // Unity performs null checks in this method.
        var tmp = new object();
        return tmp.ToString();
    }
}

public class SomeType
{
    [Il2CppSetOption(Option.NullChecks, false)]
    public string PropertyWithNullChecksDisabled
    {
        get
        {
            // Unity doesn't perform null checks here.
            var tmp = new object();
            return tmp.ToString();
        }
        set
        {
            // Unity doesn't perform null checks here.
            value.ToString();
        }
    }

    public string PropertyWithNullChecksDisabledOnGetterOnly
    {
        [Il2CppSetOption(Option.NullChecks, false)]
        get
        {
            // Unity doesn’t perform null checks here.
            var tmp = new object();
            return tmp.ToString();
        }
        set
        {
            // Unity performs null checks here.
            value.ToString();
        }
    }
}

Дополнительные ресурсы