问题已从更复杂的代码减少到这几行。 示例代码在没有amd64平台投诉的情况下运行,但dbx显示 一个无限的错误。 SPARC上发生无提示数据损坏,即 out.intnum和ip-> intnum的内容是不同的。 一旦结构" out"它就会消失。没有被采取 来自堆栈但来自静态内存。这对我来说是令人惊讶的,因为我会有 预计" out"的存储位置在执行期间仍然有效 功能"内部"。有人知道原因吗?
源文件stacker.h
#include <stdio.h>
struct stacker {
char somebytes[8];
int intnum;
unsigned char uc1;
unsigned char uc2;
};
int inner(struct stacker *ip);
int outer(struct stacker *op);
源文件stacker.c
#include "./stacker.h"
int inner(struct stacker *ip)
{
char bubble[4096];
int i;
i = ip->intnum;
return(0);
}
int outer(struct stacker *op)
{
char bubble[4096];
struct stacker out;
inner(&out);
return(0);
}
源文件stacktest.c
#include "./stacker.h"
int main(int argc, char *argv[]) {
struct stacker main_struct;
outer(&main_struct);
printf("done\n");
return(0);
}
当在命令行上运行时,程序只需打印&#34; done&#34;。 在dbx中,以下消息显示问题:
(dbx) run
Running: stacktest
(process id 4092)
RTC: Enabling Error Checking...
RTC: Running program...
Reading disasm.so
Read from out-of-bounded (rob):
Attempting to read 4 bytes at address 0xfffffd7fffdfeb94
which is 4164 bytes above the current stack pointer
Variable is 'ip'
stopped in inner at line 8 in file "stacker.c"
(dbx) print ip
ip = 0xfffffd7fffdfeb8c
访问结构&#34; out&#34;通过指针ip in function&#34; inner&#34;应该是合法的。 初始化&#34;&#34;结构&#34;无论是通过memset还是成员方式 不会改变图片(经过测试)。