有谁知道为什么会发生这种情况?
我在 AIX 5.3 中有一个 C 程序,有人要求我在 SPARC Solaris 10 机器上运行它,但是当我这样做时,我注意到有一个缓冲区溢出,其中一种是不计后果的 strcat 使用。我的目标不是清理代码,而是提供一个具体而有根据的答案,说明为什么这种溢出发生在 Solaris 而不是 AIX 上是完全相同的错误编码程序。
我一直在阅读一些关于这是否可能是由以下原因引起的:
AIX 和 Solaris 之间的字节序差异。执行 strcat 函数(AIX 从右到左复制,Solaris 从左到右复制),但我找不到任何关于此的文档。
- 很幸运,这个问题在 AIX 上没有发生。
非常感谢您对此有所了解。
编辑:可以通过solaris 上的 noexec_user_stack 标志避免这种情况吗?
编辑 2: 有没有人知道两个操作系统进行实际字节复制的方式?在类似于上述选项 2 的情况下?
编辑3:这是代码块:
/*global*/
char bufferA[101];
/*inside function*/
bufferA[0]='\0';
strcpy(bufferA,"1");
if (atoi(something)==0) {
strcat(bufferA,pieces_of_data);
count ++ ;
}
显然还有更多,但这是唯一使用bufferA的部分,并且在bufferA之后声明了2个全局变量,这些变量被附加到bufferA的最后一个字符串的最后一部分损坏。
正如我之前所说,如果我将声明从 101 更改为 201,则不会发生腐败。
编辑 4:有人知道关于 solaris 上的 -misalign 和 -misalign2 编译器选项吗?这些选项有什么亮点吗?实际上,一个更好的问题是:AIX powerPC 和 Solaris SPARC 在对齐方面有什么区别吗?尽管这可能是 serverfault 的问题,但如果您知道的话,请分享。