다음의 간단한 코드에서 텍스처에 1 채널 데이터를로드합니다. 나는 glTexImage2D()
을 GL_LUMINANCE
(1 채널 형식 임)과 GL_UNSIGNED_BYTE
으로 사용하므로 픽셀 당 1 바이트가 필요합니다. 입력 픽셀 데이터를 나타내는 픽셀 수 (2 x 2)와 동일한 크기의 버퍼를 할당합니다 (픽셀 값은 우리의 목적에 상관 없습니다).glTexImage2D는 버퍼의 경계 (iOS)를 넘어서 읽습니다.
#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);
: 당신은 소독제를 사용할 주소와 다음 코드를 실행하면
는, 그것이 힙 - 할당 된 버퍼의 경계를 넘어 읽으려고한다는, glTexImage2D()
에 대한 호출에서 힙 버퍼 오버 플로우를 감지 이것은 100 % 재현 가능하며 iOS 시뮬레이터와 장치 모두에서 발생합니다. 버퍼의 크기를 6으로 늘리면 오버플로가 발생하지 않습니다 (예상 크기 인 4보다 2 크다).
1x1과 4x4의 크기에는이 문제가없는 것 같지만 2x2와 3x3은 있습니다. 그것은 다소 독창적 인 것처럼 보입니다.
무엇이 잘못 되었나요?
'GL_UNPACK_ALIGNMENT'이 '1'로 설정되어 있습니까? – genpfault