当前位置: 首页 > 知识库问答 >
问题:

向量化的strlen读取未分配内存

汤念
2023-03-14
3de0:   48 83 c7 10             add    $0x10,%rdi
3de4:   66 0f ef c0             pxor   %xmm0,%xmm0
3de8:   66 0f 74 07             pcmpeqb (%rdi),%xmm0
3dec:   66 0f d7 f0             pmovmskb %xmm0,%esi
3df0:   85 f6                   test   %esi,%esi
3df2:   74 ec                   je     3de0 <__platform_strlen+0x40>

这肯定不总是一件好事,例如,未分配的内存可能会被取消映射。然而,一定有什么东西能让这一切奏效。我的一些假设:

  • OSX不仅保证它的分配是16字节对齐的,而且还保证分配的“量程”是16字节的块。换句话说,分配5个字节实际上会分配16个字节。分配20个字节实际上将分配32个字节。
  • 在编写asm时读取数组末尾本身并无害,因为这不是未定义的行为,只要它在范围内(在页面内?)。

实际原因是什么?

//  returns the length of the string s (i.e. the distance in bytes from
//  s to the first NUL byte following s).  We look for NUL bytes using
//  pcmpeqb on 16-byte aligned blocks.  Although this may read past the
//  end of the string, because all access is aligned, it will never
//  read past the end of the string across a page boundary, or even
//  accross a cacheline.

共有1个答案

章兴发
2023-03-14

我是有问题的例行公事的作者。

正如其他一些人所说,关键是读取都是对齐的。虽然读取数组边界以外的数据是C语言中未定义的行为,但我们并不是在编写C语言;除了C抽象机器定义的内容之外,我们还知道x86体系结构的许多细节。

特别是,超出缓冲区末尾的读取是安全的(这意味着它们不会产生陷阱或其他可观察到的副作用),只要它们不跨越页边界(因为内存属性和映射是按页粒度跟踪的)。由于支持的最小页大小为4096字节,所以对齐的16字节加载不能跨越页边界。

 类似资料:
  • 读取未初始化的变量会导致未定义的行为,例如 有人能给这个事实一个正式的解释吗?

  • 在Java中,我有以下代码用于为intPointer创建分配。但是在renderscript计算之后,我无法返回分配的值。没有copyTo(int)方法,只有byte[],short[],int[],float[],位图。 log.d(“ints”,string.valueof(i));给出和rsDebug(“rs”,*intpointer); 如何从分配中获取int值?

  • 我有一个关于java如何处理未使用变量的问题。 假设我有以下代码: 那么我就不会在代码中使用notUsedVariable。该变量是否会被存储,或者java是否足够聪明,可以在编译时忽略该变量? 谢谢

  • 问题内容: 如果我有一个带有列的数据框,并且想根据在伪代码中使用它的值来创建列: 我将如何实现?我认为这是最好的方法,但是不确定如何正确编码。 问题答案: 一种简单的方法是先分配默认值,然后执行两次调用: 如果您想使用,则可以使用嵌套: 因此,这里我们定义第一个条件为x小于-2,返回1,然后有另一个条件测试另一个条件,其中x大于2并返回-1,否则返回0 时机 因此,对于此样本数据集,该方法的速度是

  • 我正在使用webpack,浏览器中出现以下错误: 编译时没有错误或警告。 validator.js的第15行如下所示:

  • 在Jenkins中,我试图设置一个动态环境变量。 我使用Scriptler创建了一个Groovy脚本并将结果写入文件。 然后,我使用EnvInject来读取该文件的内容。 Groovy脚本: 设置: 但是,我想要设置的环境变量仍然无法识别: 知道为什么无法识别环境变量吗?