当前位置: 首页 > 网络应用技术

去查看不安全软件包的源代码

时间:2023-03-07 15:05:30 网络应用技术

  查看源代码的朋友应该在标准库中发现大量使用。如果您想更好地了解源代码的实现,则必须知道到底是什么?所以今天我会和您谈谈。

  众所周知,被设计为强大的静态语言类型,那么他的类型就无法更改,并且静态考试是在运行时进行的。因此,不允许将两种指针类型转换为语言。使用语言的朋友应该知道这可以通过语言实现。不允许在安全考虑方面使用它。毕竟,强迫转换会引起各种特字典礼,这些麻烦很容易被检测到,有时它们被隐藏得非常深和难以检测。大多数读者可能不明白为什么类型的转换不安全。这是语言中的一个简单示例:

  在标准中,任何非类型指针都可以与类型指针关联。它还可以将类型指针用作中介机构,以间接获得不同类型的指针。在上述示例中,指向指针的空间是双重精确数据,它占据了一个字节,但是在转换后,它指向字节的类型。这种内存的设计缺陷将在转换后隐藏安全危害。我认为这是该语言被设计为强大语言的原因之一。

  尽管类型转换是不安全的,但在某些特殊情况下,可以使用可以破坏的类型和存储安全机制可以绕过类型的系统效率低下并提高操作效率。因此,标准库提供了一个袋子。不建议每个人都建议使用此名称的原因,但不可用。如果您特别掌握它,您仍然可以练习。

  让我们在使用之前先看一下源代码部分。只有标准库包仅提供方法,即:

  小心的朋友会发出这三种方法返回的所有类型。此目的是将其转换为类型,因为它不能计算或计算,但是可能是可能的,因此您可以使用该类型来计算计算。这样,您可以访问特定的内存以实现不同内存的目的阅读和写作。这三种方法都是所有类型,它们代表任何类型的含义,并且还提供指针类型,即相同的一般 - 可使用指针。

  如果您在上面说太多了,那么您可能会有些尴尬。在这里,您摘要三种指针:

  三个之间的关系是:这是一座桥梁,允许任何类型的指针实现相互转换。它还可以将任何类型的指针转换为指针操作。也就是说,它用于与指针操作合作。画一张图片以指示:

  基本原理在这里,让我们看一下如何一起使用它?

  当我们在上一篇文章中分析源代码时,我们发现在其中定义了一个结构。其中,字段类型是使用类型的原因是,此处的值是传输的值。,对于随后的写作类型考试很方便。该代码的截距部分如下:

  以上是源代码中使用的示例。有一天,当您准备读取源代码时,可以在任何地方看到使用。

  操作结果:

  使用强制性类型转换后指向指针的地址没有更改,但是类型已更改。此示例本身毫无意义,并且不会在普通项目中使用。

  总结基本用途:首先将类型转换为类型,然后将其转换为所需的指针类型。

  首先看一个示例:

  为了节省麻烦,将三个功能的使用示例放在一起。首先,我们可以看到每种类型占据的字节的方法。在这里,我们专注于类型。中间类型的特定大小与机器数量有关。如果是一点,则字节被占据。如果是位,则字节是字节。我的计算机是,因此结果是字节。

  然后,我们查看功能。我想修改结构中的成员变量。第一个成员变量无需通过偏移计算。直接采用指针后,指针值将转换为字符串类型的指针值。方法可以返回结构中成员变量的偏移,即,结构的初始位置到成员变量之间的成员变量返回结构的结构。字节数。当您查看代码时,应该使用它。请勿使用临时变量存储类型。我们前面提到,它用于指针操作。它不被用作指针,不能持有。目标的类型将被回收,因此您不知道他何时会被丢弃,所以下一个内存操作会发生什么,我们不知道。例如,这样的例子:

  最后,查看该函数,主要是获得变量的对齐值。除了这些类型的依赖项外,基本类型的基本类型是固定的。在内存中涉及,我们在下面详细介绍了它。

  为了实现转换和正常情况,在正常情况下,我们可以写下这样的标准转换:

  使用此方法进行转换的使用将涉及基础值的副本,因此,如果我们要实现零副本,我们可以使用它来实现它,并直接通过强转换来完成指针的方向,以便使同样的基础数据。

  它代表运行时的表达式(sliceheader)。可以通过比较和运行时表达式可以看出它们只有一个字段,因此它们的内存布局是对齐的,因此可以对其进行调整,因为它们可以写作,因为它们可以写作,因为它们可以写作,因为它们可以写作,因为它们可以写作,因为它们可以写作可以编写它们,因为它们可以编写,因为它们可以写作,因为它们可以写作,因为它们可以编写。以下代码:

  上述代码我们已重新构造并完成了类型转换。实际上,转换可用于省略我们自己的结构。它可以直接用于使用强旋转,因为基础层也是自动构造函数。省略的代码如下:

  尽管此方法更有效,但不建议使用它,并且以前已经对其进行了改进。如果不安全,当使用不当使用时,将会存在很大的隐藏危险,并且无法捕获一些严重的情况。

  目前,计算机中的内存空间根据它进行分配。从理论上讲,似乎可以从任何地址开始访问任何类型的变量,但是在访问特定类型的变量时,实际情况通常可以在特定的内存地址中访问。所有类型的数据都需要在太空中排列空间中的所有类型根据某些规则,而不是按顺序一致的顺序。

  对齐的角色和原因:访问内存时,它不是字节访问,而是word -length()单元访问。可以减少进入内存的访问次数并增加访问存储器的吞吐量。我们需要读取8个字节的数据,您只需要一次读取一个字节。MEMORY对齐也适用于实现的原子操作变量。每个内存访问都是原子。如果变量的大小不超过单词长度,则在对齐内存后,对变量的访问将被原子。该特征是同时发生的,场景很重要。

  让我们看一个例子:

  从结果可以看出,字段的放置不同,并且内存不同。这是因为内存对齐的大小会影响内存的大小,因此有时合理的字段可以减少内存开销。LET的分析内存对齐在一起。首先,我们必须了解记忆规则是对齐的。

  好吧,知道规则,让我们现在分析上述示例。根据我使用的64位,对齐参数分别分别为8分,分别占据记忆的大小,分别为记忆的大小,,,,,,,,让我们首先分析第一个规则:

  这么多说,画一张图片以查看:

  现在,您应该理解它,并根据此想法分析其他两个,并且不再在此处进行分析。

  在内存的结尾,还有一个知识点需要注意。它不占用任何存储空间,空大小为0。当它是其他结构的字段时,通常不需要内存对齐。需要内存。由于有指向字段的指针,返回地址将在结构之外。如果该指针在没有释放相应内存的情况下生存下来,则会存在内存泄漏的问题(内存未通过结构的结构发布)。查看一个示例:

  简而言之,对于任何类型的0个大小空间,如果这种类型出现在结构的末端,那么我们假设它占1个字节的大小。因此,对于结构,他看起来像这样:

  因此,当记忆对齐时,最终结构占据的字节为8。

  关注问题:请勿将零尺寸类型添加到结构的最终定义中

  好吧,最后,到本文的结尾,让我们简要介绍一下。不安全的环绕go类型系统以达到直接操作内存并使用它具有一定风险的目的。在某些情况下,不安全软件包提供的功能将提高代码的效率,而GO源代码也使用大量不安全的软件包。

  不安全的软件包定义了指针和三个功能:

  可以使用Unsafe.pointer转换UINTPTR,并且UINTPTR可以执行数学操作。这样,UINTPTR和Unsafe.pointer的组合解决了GO Pointer上的限制,无法执行数学操作。可以获得结构的私人成员,然后进一步读取和写入操作,并突破GO的类型安全限制。

  最后,我们再次学习了知识,以便设计可以减少访问存储器的数量并增加访问存储器的吞吐量。因此,结构中字段的合理排序可以保存内存。

  原始:https://juejin.cn/post/7099353249613873166好吧,这在这里,连续三个质量(共享,喜欢,观看)都是继续创建更高质量的内容的动力!

  创建一个Golang学习和交流小组。欢迎所有的大兄弟积极进入小组,我们一起学习和交流。如何进入小组:添加我VX将您吸引到小组中,或者公共帐户获取该组的QR码

  最后,我将为所有人提供一个小的好处。最近,我正在阅读[Micro -Service Architecture Design模式]。这很棒。我还收集了PDF。您可以自己下载它。如何获取:注意公共帐户:[Golang Dream Factory],回复背景:[Micro Service],您可以得到它。

  我翻译了一份杜松子酒中文文件,该文件将定期维护。您可以在后台下载[Gin]。

  翻译一份手机文档,并将定期维护。您可以在背景中所需的朋友的背景下获得它。

  我是一个普通的程序猿,让我们变得更加强大。引起您的注意,我们下次见到你~~~

  推荐文章:

  本文使用文章同步助手同步