gpt4 book ai didi

c - 长度设置为 0 的 glShaderSource

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:10 24 4
gpt4 key购买 nike

我想知道 glShaderSource 在这种极端情况下的行为是否正确:

glShaderSource(shader, 1, (const char**)ptr, length) 

哪里:

char * tmp = (char*)alloca(0);
const char ** ptr = &tmp;
GLint length[1] = { 0 };

所以基本上 OpenGL 被告知读取一个零长度的字符串,但它仍然对其调用 strlen,即使它知道它的长度。在规范中它说只有当我们将 NULL 作为第 4 个参数传递或给定的长度小于 0 时,OpenGL 才会假定字符串以零终止。为什么调用 strlen?这种行为是否正确?

最佳答案

有两种情况允许 OpenGL 驱动程序假定着色器数据以 null 终止,如 OpenGL 4 引用页中所述。

来自 glShaderSource文档:

If length is NULL, each string is assumed to be null terminated. If length is a value other than NULL, it points to an array containing a string length for each of the corresponding elements of string. Each element in the length array may contain the length of the corresponding string (the null character is not counted as part of the string length) or a value less than 0 to indicate that the string is null terminated. The source code strings are not scanned or parsed at this time; they are simply copied into the specified shader object.

由于所强调的约束都不适用于所提出的情况,因此不允许驱动程序直接在提供的数据上使用不安全的 c 字符串函数,如 strlen。如果是这样,它可能会跑完数据末尾并可能最终访问未分配的内存,从而导致程序崩溃。

但是,驱动程序允许将数据复制到安全缓冲区中,然后对其调用strlen。例如,一个实现可能包含如下代码:

void glShaderSource(GLuint shader,
GLsizei count,
const GLchar **string,
const GLint *length)
{
if (length == NULL) { /* each string is null terminated. */ }
else for (GLsizei i = 0; i < count; ++i)
{
size_t len = length[i];

if (len < 0) { /* this string is null terminated. */ }
else
{
char* buffer = (char*)malloc(len + 1);
memcpy(buffer, string[i], len);
buffer[len] = 0;

size_t str_len = strlen(buffer);
// This is OK, because we copied the
// data into a null terminated buffer.

free(buffer);
}
}
}

因此,如果您的驱动程序实际上在这种情况下对用户提供的指针调用 strlen,那么它违反了 OpenGL 规范,并且容易导致程序崩溃,但仅仅看到 strlenglShaderSource 调用并不一定意味着它是传递给它的用户提供的字符串之一。

稍微切题一点,当一个空字符出现在一个带有显式长度的字符串中时会发生什么,标准没有指定,这意味着实现可以随心所欲。它可以将字符串视为空终止(因此跳过它之后的所有内容)、忽略空字符,或者导致着色器编译失败,因为它不在 GLSL 识别为空白的字符中。

关于c - 长度设置为 0 的 glShaderSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19716564/

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