【问题标题】:Wide string libc functions on unaligned memory未对齐内存上的宽字符串 libc 函数
【发布时间】:2014-04-11 16:27:10
【问题描述】:

所以我在痛苦的调试后发现,像 wcslen 这样的 libc 函数在处理非内存对齐缓冲区时会静默失败。在我的情况下,执行 wcslen( mystr ) 会导致错误的长度值,后来才产生崩溃(在 wcstombs 中,断言 buff[-1] == 0)。

一种解决方案是让我重新编写在非对齐内存上工作所需的所有宽字符串函数。这很容易,但也很脏,而且由于没有关于 libc 的哪些部分支持非内存对齐缓冲区的文档,我担心这个问题会在其他地方再次出现。

确保我的所有指针都对齐并不是一个简单的选择,因为我要处理大量的子缓冲区缓冲区,并且必须在主缓冲区之外手动复制我的数据需要很长时间。例如,在我的情况下,失败的操作类型是当我在大缓冲区中抓取(循环)字节以查找宽字符串然后计算长度时。

由于我不打算支持太多指针内存对齐会破坏交易(崩溃)的平台,还有其他解决方案吗?也许是编译器标志?

我知道某些平台或环境需要内存对齐,但我正在处理基本的 Windows 和 Linux 用户模式,所以请不要像“你做错了,你必须始终对齐所有内容”之类的“说教”回答,除非你有一个实际的解决方案,谢谢。

【问题讨论】:

  • 终于找到讨论的问题了。一定要喜欢完全没有任何文档。仍在试图找出一种禁用优化的方法,似乎这是不可能的。 forums.warchest.com/showthread.php/…

标签: c unicode glibc memory-alignment


【解决方案1】:

嗯,C 和 POSIX 标准都要求标准对齐,所以如果你将未对齐的指针强制输入函数,你就违反了合同。

因此,我怀疑您能否说服库维护人员将其视为错误。

此外,我认为扩展合同的功能请求不会获得太大的吸引力。

因此,最后,我最好的也是最终的建议是:编写自己的代码,并明确将指针标记为未对齐。也许在每个函数开始时检查对齐并委托给标准实现,以实现最佳速度...

我认为您不需要任何复杂的函数来处理可能未对齐的数据,因此请编写代码。

【讨论】:

  • 有趣,非常感谢您的回答。我希望它不会到那个地步,但就这样吧。但是,您提到 C 和 POSIX 标准要求对齐。我考虑了这种可能性并在网上寻找支持文档,但找不到任何支持文档。你能指出这是在哪里指定的吗?我能找到的最接近的是提到它是架构强制要求的文件,而 x86 没有强制要求,这导致我感到困惑......谢谢
  • 其实并没有我想的那么简单,wcstombs内部使用的是wcslen,所以我得重新实现wcstombs。
  • 好吧,那时你可能会将感兴趣的数据复制到正确对齐的缓冲区中。如果唯一有趣的编码是 UTF-8、UTF-16 和 UTF-32,那么编写自己的编码应该不难。
  • @user3395838 没有可显示的内容。如果不以某种方式违反标准,就不能产生未对齐的指针。但是,您首先获得了传递给wcslen 的指针,但您必须执行 C 标准未定义的操作。
猜你喜欢
  • 2015-07-10
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
相关资源
最近更新 更多