new연산자에 의한 할당에서 오버플로우 오류가 나지 않습니다

sell의 이미지

일부러 오버플로우 시켜 보았습니다.

#include<iostream>
using namespace std;
 
int main(){
 
 int* ax;
 ax = new int[10];
 
 ax[11] = 123;
 cout << ax[11] << endl; 
 
 return 0;
} 

g++과 VC++에서 돌려보았는데, 런타임 오류가 일어나지 않습니다.

원래 이런건가요?

kds6221의 이미지

C/C++ 은 배열 사이즈 검사 안해주는데요 그냥 할당합니다.

바로 그 침범당한 메모리를 사용하지 않는 이상 에러 안날땐데요

그래서 그것을 악용한 공격들이 많지요~

JAVA 나 .NET 은 검사해줍니다.

lqez의 이미지

당연한 결과라고 생각합니다.
컴파일러에서 buffer 관련 체크 옵션을 준다고 해도, 잘 잡아주지 못하는 것으로 압니다.

실제 문제가 발생되는 시점은, 이렇게 오염된 이후에 실제 [10]~ 이후의 영역을 사용하고 있던 녀석을 사용하려고 할 때 발생하겠죠.
그것도 런타임 오류라기 보다는 로지컬한 오류로...