gpt4 book ai didi

c - 未对齐内存上的宽字符串 libc 函数

转载 作者:行者123 更新时间:2023-11-30 17:37:52 25 4
gpt4 key购买 nike

因此,经过痛苦的调试,我发现像 wcslen 这样的 libc 函数在处理非内存对齐缓冲区时会默默地失败。在我的例子中,执行 wcslen( mystr ) 会导致长度值错误,随后才导致崩溃(在 wcstombs 中,断言 buff[-1] == 0)。

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

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

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

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

最佳答案

嗯,C 和 POSIX 标准都强制要求标准对齐,因此如果将未对齐的指针强制输入到函数中,则违反了约定。

因此我怀疑你能否说服库维护者将其视为一个错误。

此外,我认为扩大契约(Contract)的功能请求不会引起太大关注。

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

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

关于c - 未对齐内存上的宽字符串 libc 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22268475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com