【发布时间】:2013-10-31 21:03:47
【问题描述】:
我想知道 glShaderSource 在这种边缘情况下的行为是否正确:
glShaderSource(shader, 1, (const char**)ptr, length)
地点:
char * tmp = (char*)alloca(0);
const char ** ptr = &tmp;
GLint length[1] = { 0 };
所以基本上 OpenGL 被告知要读取一个长度为零的字符串,但它仍然会调用 strlen ,即使它知道它的长度。在规范中,它说只有当我们将 NULL 作为第四个参数传递或给定长度小于 0 时,OpenGL 才会假定字符串为零终止。为什么调用 strlen?这种行为正确吗?
【问题讨论】:
-
零长度 c 字符串的实际长度为 1 个字节,因此您应该使用 alloca(1)
-
@bcrist:这里 GL 期望的长度是没有字符串终止标记的 crachter 数。
-
啊,那么是的,这可能是您的驱动程序实现中的错误
-
是的,您的驱动程序似乎不符合规范。您是否有理由需要支持非零终止字符串?一般来说,总是要求字符串以空值结尾是个好主意,因为在测试库等时很容易错过这种类型的错误。
-
在 Haskell OpenGL 绑定中,如果你读取一个空文件,你会得到一个空的 ByteString。如果你将该 ByteString 传递给 OpenGL,alloca 会以 0 长度被调用,并且指针会被传递给 glShaderSource。