有人知道为什么会这样吗?
我在AIX 5.3中有一个C程序,我被要求在SPARC Solaris 10机器上运行它,但是当我这么做的时候,我注意到有一个缓冲区溢出,其中一个是许多鲁莽的Struts用途。我的目标不是清理代码,而是提供一个具体而有根据的答案,解释为什么在Solaris上会发生这种溢出,而不是在AIX上,因为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之后声明为global,这些变量随着最后一个字符串的最后一部分附加到bufferA而损坏。
如前所述,如果我将声明从101改为201,腐败就不会发生。
编辑4:有人知道solaris上的-misalign和-misalign2编译器选项吗?这些选项有什么用吗?实际上,一个更好的问题是:AIX PowerPC和Solaris SPARC在对齐方面有什么不同吗?虽然这可能是一个服务器故障的问题,但请分享,如果你知道一些东西。
最佳答案
不是(坏的?)幸运的是,也许是内存管理系统略有不同的产物,在AIX上分配的空间比在Solaris上分配的空间要多。
这在一定程度上取决于洪水泛滥的严重程度。如果它们是超出界限的几个字节,并且如果AIX习惯性地在Solaris分配最小16字节块的地方分配最小32字节的块,那么在AIX上比在Solaris上有更大的错误空间而不会造成损坏。即便如此,如果在错误的上下文中出错,AIX也应该有这个问题——您可以认为自己不幸运,因为正如您所说,如果您编译的源代码相同,那么在AIX上观察到这个问题肯定与在Solaris上观察到的问题一样多。
进一步调查显示:
对于32位编译,AIX 5.3与Solaris一样,每次分配16字节的倍数。
对于64位编译,AIX 5.3每次分配32字节的倍数;这与Solaris相同。
但是,如果在AIX和Solaris之间在32位和64位构建之间进行了更改,这可能仍然是问题的根源。
不管答案是什么,现在您已经知道了,用一组更改来修复这两个平台。你对每一个暴露出来的bug都心存感激;在任何时候,对原始平台的更改都可能暴露出问题——导致客户不满意的重大问题。
(哦,我认为SPARC和PPC都是大型的Endiad机器;它是英特尔,它是一个小字节,与世界其他地方不同。)
测试代码-故意泄漏
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int sz ;
char *buffer;
for (sz = 1; sz < 1025; sz *= 2)
{
buffer = malloc(sz);
printf("0x%08lX\n", (unsigned long)buffer);
}
return 0;
}
关于c - AIX 5.3与Solaris 5.10-C strcat实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3780918/