首页 > 修改教程 > gg修改器内存加速游戏代码_gg修改器加快游戏速度
gg修改器内存加速游戏代码_gg修改器加快游戏速度
  • gg修改器最新版
  • 大小:9.96MB版本:v7.11
  • 语言:简体中文系统:Android
绿色无毒,安全可靠!部分设备误报拦截请通过!

gg修改器内存加速游戏代码_gg修改器加快游戏速度

作者:佚名 来源:网友分享 日期:2024-03-29 19:00:47

大家好,今天小编为大家分享关于gg修改器内存加速游戏代码_gg修改器加快游戏速度的内容,赶快来一起来看看吧。

概述

InferSharp 将Infer的可扩展、自动化和过程间内存安全分析引入 .NET 平台。这项工作有两个关键的知识组成部分,在下图中以绿色突出显示。

背景

当今市场上可用的 .NET内存安全分析中的大部分工作是过程内的(分析仅限于单个方法的上下文)或依赖于开发人员注释。例如,PreFast检测到一些空解引用异常和内存泄漏的实例,但它的分析纯粹是过程内的。同时,JetBrains Resharper严重依赖开发人员注释进行内存安全验证。

相比之下,像Infer这样的过程间分析器会考虑不同方法的上下文,从而可以检测到更微妙的问题。此外,它是自动化的(它不依赖于开发人员注释),并通过分析增量更改在大型生产代码库上有效扩展。它使用分离逻辑(一种用于推理计算机内存操作的程序逻辑)来证明某些内存安全条件。为此,它利用了Smallfoot谓词框架,该框架以 Smallfoot 中间语言 ( SIL ) 表示。

SIL 的与语言无关的表示

使 Infer 能够分析 .NET 源代码的核心问题是将其转换为 SIL,即 Infer 分析的语言。为此,源语言结构需要在 OCaml 中表示。InferSharp 通过引入与语言无关的中间层简化了这项任务,该层缓解了其他翻译方法中存在的与语言相关的挑战。

在 C 语言翻译管道中,抽象语法树 (AST) 被导出为 JSON 格式,通过 atdgen 库从中提取类型定义并在 OCaml 中进行翻译。在 Java 管道中,称为 Javalib 的 OCaml 库用于提取 Java 字节码类型定义。然后将这些类型定义翻译成 OCaml。这种方法存在以下主要缺点:

由于这些原因,我们引入了 SIL 的与语言无关的 JSON 序列化,以及一个反序列化包,该包在 OCaml 中提取 SIL 数据结构。然后,Infer 的后端分析直接使用输出。

.NET 的管道实现

从源代码的低级表示开始工作的优点有两个:首先,CIL 是所有 .NET 语言的基础(例如除了最常见的 C# 之外的 Visual Basic 和 F#),因此 InferSharp 支持所有 .NET 语言通过这种方式,其次,CIL 去除了任何语法糖,从而减少了翻译所需的语言内容,从而简化了翻译。

此表示的主要组件是类型环境和控制流图 (CFG)。有关说明这些组件的示例,请参阅示例翻译。

我们现在更详细地讨论管道的实现。.NET 二进制文件首先使用Mono.Cecil库反编译成 CIL ,然后我们从中检索可用的类型定义和方法指令。类型定义信息包括:

为软件项目中出现的所有类型以及这些类型继承的所有类检索此信息。每种类型都作为一个条目存储在 JSON 文件中,我们称之为类型环境

第二个组件是控制流图。对于软件项目中的每个过程,管道生成一个过程描述,该描述由方法信息(全名、参数、返回类型和局部变量)以及节点列表(包含后继/前驱边)组成信息)组成程序。这些节点由翻译管道产生。它遍历每条指令并将其解析为相应的 SIL 指令。这些翻译后的指令被添加到 CFG 节点,而 CFG 节点又被添加到 CFG 节点列表中。生成的过程描述由节点 ID 列表和过程元数据组成,然后作为条目存储在 CFG JSON 中。

换句话说,控制流图由三个概念组件组成:

示例翻译

在本节中,我们将展示一个翻译管道如何运作的示例。在此示例中,我们考虑如下所示的源代码:

public void InitializeInstanceObjectField(bool initializeToNull)
=> InstanceObjectField = initializeToNull ? null : new TestClass();

它对应的字节码是:

.method public hidebysig instance void
InitializeInstanceObjectField(bool initializeToNull) cil managed
{
// Code size 18 (0x12)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: brtrue.s IL_000b

IL_0004: newobj instance void Cilsil.Test.Assets.TestClass::.ctor()
IL_0009: br.s IL_000c

IL_000b: ldnull
IL_000c: stfld class Cilsil.Test.Assets.TestClass Cilsil.Test.Assets.TestClass::InstanceObjectField
IL_0011: ret
} // end of method TestClass::InitializeInstanceObjectField

管道生成的部分类型环境 JSON 如下所示。它描述了 TestClass 类,其中包括对其实例和静态字段的描述。在这种情况下,字段也是对象;这表明它们被标识为结构化数据类型(“Tstruct”)的指针类型(“Tptr”)。

{
"type_name": {
"csu_kind": "Class",
"name": "Cilsil.Test.Assets.TestClass",
"type_name_kind": "CsuTypeName"
},
"type_struct": {
"instance_fields": [
{
"field_name": "Cilsil.Test.Assets.TestClass.InstanceObjectField",
"type": {
"kind": "Pk_pointer",
"type": {
"struct_name": "Cilsil.Test.Assets.TestClass",
"type_kind": "Tstruct"
},
"type_kind": "Tptr"
},
"annotation": {
"annotations": []
}
},
{
"field_name": "Cilsil.Test.Assets.TestClass.InstanceArrayField",
"type": {
"kind": "Pk_pointer",
"type": {
"content_type": {
"kind": "Pk_pointer",
"type": {
"struct_name": "Cilsil.Test.Assets.TestClass",
"type_kind": "Tstruct"
},
"type_kind": "Tptr"
},
"type_kind": "Tarray"
},
"type_kind": "Tptr"
},
"annotation": {
"annotations": []
}
}
],
"static_fields": [
{
"field_name": "Cilsil.Test.Assets.TestClass.StaticObjectField",
"type": {
"kind": "Pk_pointer",
"type": {
"struct_name": "Cilsil.Test.Assets.TestClass",
"type_kind": "Tstruct"
},
"type_kind": "Tptr"
},
"annotation": {
"annotations": []
}
},

字节码到 CFG 的转换操作如下:

我们生产的 CFG 如下图所示。在任何给定的 CFG 中,节点与整数标识符、前驱节点标识符列表(“preds”)、后继节点标识符列表(“succs”)和异常节点标识符列表(“exn”)相关联.

n$0 表示TestClass 指针“this”的值,n$1 表示布尔变量initializeToNull 的值。与 C 的语法类似,表达式 *n$0.Cilsil.Test.Assets.TestClass.InstanceObjectField 表示 null 存储在 n$0 的 InstanceObjectField 中。

PRUNE 节点根据 n$1 的真值指示控制流。

node16586的指令与对象分配相关;首先,大小为 TestClass 的内存被分配并由 n$2 标识。然后,在分配的内存上调用 TestClass 的构造函数。最后,这个新分配的对象的指针被赋值为 n$0 的 InstanceObjectField 的值。

node16583 preds: 16580 succs: 16584 16585 exn: 16582 MethodBody
n$0=*&this:Cilsil.Test.Assets.TestClass* [Line 41];
n$1=*&initializeToNull:bool [Line 41];

node16584 preds: 16583 succs: 16581 exn: 16582 MethodBody
PRUNE (n$1, True) [Line 41];
*n$0.Cilsil.Test.Assets.TestClass.InstanceObjectField:Cilsil.Test.Assets.TestClass:Cilsil.Test.Assets.TestClass=null [Line 41];

node16585 preds: 16583 succs: 16586 exn: 16582 MethodBody
PRUNE (!(n$1):, False) [Line 41];

node16586 preds: 16585 succs: 16581 exn: 16582 Call
n$2:Cilsil.Test.Assets.TestClass*=_fun static BuiltIn.__new() (sizeof(Cilsil.Test.Assets.TestClass, exact):Cilsil.Test.Assets.TestClass*) [Line 41];
n$3:void=_fun System.Void Cilsil.Test.Assets.TestClass..ctor() (n$2:Cilsil.Test.Assets.TestClass*) [Line 41];
*n$0.Cilsil.Test.Assets.TestClass.InstanceObjectField:Cilsil.Test.Assets.TestClass:Cilsil.Test.Assets.TestClass=n$2 [Line 41];

然后通过 Infer 分析 CFG 以生成错误报告。例如,在以下引用上述方法的代码中:

public void TestMethod()
{
TestClass Tc;
Tc = new TestClass();
Tc.InitializeInstanceObjectField(true);
_ = Tc.InstanceObjectField.GetHashCode();
}

Infer 最终在程序间检测到它Tc.InstanceObjectField为 null,其取消引用构成错误:

Assets/TestCode.cs:14: error: NULL_DEREFERENCE (biabduction/Rearrange.ml:1622:55-62:)
[B5] pointer `%0->Cilsil.Test.Assets.TestClass.InstanceObjectField` could be null and is dereferenced at line 14, column 1.
12. Tc = new TestClass();
13. Tc.InitializeInstanceObjectField(true);
14. > _ = Tc.InstanceObjectField.GetHashCode();

以上就是关于gg修改器内存加速游戏代码_gg修改器加快游戏速度的全部内容,希望对大家有帮助。

相关文章

热门下载

大家还在搜