相关疑难解决方法(0)

矢量化的strlen逃脱阅读未分配的记忆

在研究OSX 10.9.4的strlen实现时,我注意到它总是比较一个16字节的块并向前跳过到接下来的16个字节,直到它遇到'\0''.相关部分:

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>
Run Code Online (Sandbox Code Playgroud)

0x10 十六进制是16个字节.

当我看到它时,我想知道:这个记忆也可以不被分配.如果我已经分配了一个20字节的C字符串并将其传递给strlen它,它将读取36字节的内存.为什么允许这样做?我开始寻找并发现访问数组越界有多危险?

例如,这证实了它绝对不是一件好事,未分配的内存可能未被映射.然而,必须有一些东西使这项工作.我的一些假设:

  • OSX不仅保证其分配是16字节对齐的,而且还保证分配的"量子"是16字节的块.换句话说,分配5个字节实际上将分配16个字节.分配20个字节实际上将分配32个字节.
  • 当你编写asm时读取数组的结尾本身并没有坏处,因为它不是未定义的行为,只要它在界限内(在页面内?).

究竟是什么原因?

编辑:刚刚找到为什么我获得了未分配内存的读写权限?,这似乎表明我的第一个猜测是正确的.

编辑2:愚蠢的是,我已经忘记了尽管Apple似乎已经删除了大多数asm实现的源代码(OSX的x86-64汇编libc例程在哪里?),但是它留下了strlen:http://www.opensource .apple.com /源极/ libc的/ libc的-997.90.3/x86_64的/串/ strlen.s

在评论中我们发现:

//  returns the length of the string s (i.e. the …
Run Code Online (Sandbox Code Playgroud)

c macos assembly memory-management libc

6
推荐指数
2
解决办法
461
查看次数

标签 统计

assembly ×1

c ×1

libc ×1

macos ×1

memory-management ×1