所以我在痛苦的调试之后发现,在处理非内存对齐的缓冲区时,像wcslen这样的libc函数会无声地失败。在我的情况下,做一个wcslen(mystr)导致一个错误的长度值,后来才产生崩溃(在wcstombs中,断言buff [-1] == 0)。
一个解决方案是让我重新编写我需要处理非对齐内存的所有宽字符串函数。这很容易但也很脏,而且由于没有关于libc的哪些部分支持非内存对齐缓冲区的文档,我担心问题会在其他地方再次出现。
确保所有指针都是对齐的并不是一个简单的选择,因为我处理了很多子缓冲区缓冲区并且必须在主缓冲区之外手动复制我的数据需要很长时间。例如,在我的情况下,失败的操作类型是我在一个大缓冲区中抓取(循环)字节,寻找一个宽字符串,然后计算长度。
由于我不打算需要支持太多平台,其中指针内存对齐是一个交易破坏者(崩溃),还有其他解决方案吗?可能是编译器标志?
我知道某些平台或环境需要内存对齐,但是我正在处理基本的Windows和Linux UserMode,所以请不要像“你做错了,你必须始终调整一切”这样的“说教”答案,除非你有一个实际的解决方案,谢谢。
答案 0 :(得分:0)
嗯,C和POSIX标准都要求标准对齐,所以如果你强行将错误的指针放入函数中,那么你就违反了合同。
因此,我怀疑你是否可以说服图书馆维护者将其视为一个错误。
此外,我认为扩大合约的功能要求不会引起太多关注。
因此最后,我最好和最后的建议是:编写自己的代码,并明确地将指针标记为未对齐。也许检查对齐并委托每个函数开始时的标准实现,以适应最佳速度......
我认为您的潜在错位数据不需要任何复杂的功能,所以代码就不用了。