IL2CPP Проверки кода во время выполнения
Вы можете использовать атрибут [Il2CppSetOption] C# и его параметр Option для управления тем, какие проверки безопасности включает компилятор IL2CPP в генерируемый им код C++.
[Il2CppSetOption] атрибут не входит в стандартные открытые API редактора и движка Unity, но его исходный код поставляется отдельно вместе с вашей установкой Unity. Чтобы использовать [Il2CppSetOption] атрибут:
- В каталоге, в котором установлена версия Unity, перейдите в каталог
Data\il2cppна Windows или каталогContents/Frameworks/il2cppна macOS. - Найдите исходный файл
Il2CppSetOptionAttribute.cs. - Скопируйте исходный файл в папку проекта
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();
}
}
}