在以下簡單代碼中,我將1通道數據加載到紋理。我使用glTexImage2D()
與GL_LUMINANCE
(這是一個通道格式)和GL_UNSIGNED_BYTE
,所以它應該每個像素需要一個字節。我分配一個大小等於表示輸入像素數據的像素數(2 x 2)的緩衝區(像素值對於我們的目的而言不重要)。glTexImage2D讀取超出緩衝區範圍(iOS)
當您運行與地址啓用消毒下面的代碼,它檢測到呼叫glTexImage2D()
堆緩衝區溢出,稱它試圖讀取超出堆分配的緩衝區的邊界:
#import <OpenGLES/ES2/gl.h>
//...
EAGLContext* context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:context];
GLsizei width = 2, height = 2;
void *data = malloc(width * height); // contents don't matter for now
glTexImage2D(GL_TEXTURE_2D,
0,
GL_LUMINANCE,
width,
height,
0,
GL_LUMINANCE,
GL_UNSIGNED_BYTE,
data);
這是100%可重複的,併發生在iOS模擬器和設備上。只有當你將緩衝區的大小增加到6時,它纔會溢出(比預期的大小4大2)。
尺寸1x1和4x4似乎沒有這個問題,但2x2和3x3做。它似乎有點武斷。
出了什麼問題?
GL_UNPACK_ALIGNMENT設置爲1嗎? – genpfault