gpt4 book ai didi

c - GCC:只在优化时崩溃的段错误和调试程序

转载 作者:行者123 更新时间:2023-12-03 17:23:16 31 4
gpt4 key购买 nike

这是线程的后续:C: Segmentation fault and maybe GDB is lying to me

我有一个程序可以使用 -O0 编译,但使用 -O1、-O2、-O3 和 Ofast 会出现段错误。似乎堆栈在某些时候会以某种方式损坏,但我不知道为什么或在哪里。

首先,这是我正在使用的结构的一部分。它在一个头文件中:

typedef struct {
GLuint nsHandle;
} OGL_STATE_T;

这是主文件的相关淡化部分:
void init(OGL_STATE_T *state) {

printf("init: %p\n", state); // Print pointer address make sure it's the same.

compileShaders(state);

}

int main(argc, char *argv[]) {

static OGL_STATE_T _state, *state=&_state;

printf("main: %p\n", state); // Print pointer address

init(state);

return 0;
}

然后是 compileShaders 函数。这是发生指针地址损坏的地方:
void compileShaders(OGL_STATE_T *state) {

printf("compileShaders entry: %p\n", state); // Print pointer address make sure it's good

GLuint nsVertex = compileShader("nsVertex", GL_VERTEX_SHADER, state);
GLuint nsFragment = compileShader("nsFragment", GL_FRAGMENT_SHADER, state);

printf("compileShaders return: %p\n", state); // Print pointer when returning.

state->nsHandle = glCreateProgram(); // Segmentation fault here.

/* ... */
}

正如稍后将在此处的输出中说明的那样,第二条 printf 语句返回了错误的地址。

最后是 compileShader 函数(请注意此处名称末尾缺少“s”)。最初该函数没有获取状态指针,但我添加了它,以便我可以跟踪执行过程中发生损坏的位置。
GLuint compileShader{char * shaderName, GLenum shaderType, OGL_STATE_T *state} {

printf("compileShader 1: %p\n", state); // Print state address at function entry

FILE *shaderFile;
char fileName[sizeof shaderName + 8];
long lSize;
char *buffer;

strcpy(fileName, "./");
strcpy(fileName, shaderName);
strcpy(fileName, ".glsl");

shaderFile = fopen(fileName, "rb");

fseek(shaderFile, 0L, SEEK_END);
lSize = ftell(shaderFile);
rewind(shaderFile);

buffer = calloc(1, lSize + 1);

GLuint shaderHandle = glCreateShader(shaderType);

printf("compileShader 2: %p\n", state); // Print state address at function middle

const GLchar *shaderString = buffer;
glShaderSource(shaderHandle, 1, &shaderString, 0);

glCompileShader(shaderHandle);

GLint compileSuccess;
glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &compileSuccess);

fclose(shaderFile);
shaderString = NULL;
free(buffer);

printf("compileShader 3: %p\n\n", state); // Print state address before returning

return shaderHandle;
}

现在对于踢球者,这是输出:
main: 0x1387c
init: 0x1387c

compileShaders entry: 0x1387c

compileShader 1: 0x1387c
compileShader 2: 0x1387c
compileShader 3: 0x1387c

compileShader 1: 0x1387c
compileShader 2: 0x1387c
compileShader 3: 0x1387c

compileShaders return: 0x1006c
Segmentation fault. (Core dumped)

所以这告诉我,当 compileShader() 函数退出时,地址仍然是好的,并且在它返回到 compileShaders() 后(请不要混淆一个有's'而另一个没有),地址得到腐败?

在这一点上,我有点吃惊。这很难调试,因为如果我不优化代码,我不会收到任何错误。但是,如果我确实优化了代码(无论是 O1、O2、O3 还是 Ofast),我都会遇到段错误。

printf 语句是我现在唯一的 friend ,他们现在没有告诉我任何事情。这是我向 GCC 提交错误报告的部分吗?

感谢任何花时间阅读此主题的人。我知道这有点长远。

最佳答案

问题在于 fileName compileShaders() 中的定义

char fileName[sizeof shaderName + 8]; . 

这是不正确的,没有为 fileName 分配足够的字节。 .

您需要使用 strlen(shaderName)+8 进行分配,而不是 sizeof(shaderName) .

关于c - GCC:只在优化时崩溃的段错误和调试程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22876433/

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