본문 바로가기
c언어

c언어 오버플로우 알아보기

by 개발자 L 2022. 11. 27.
반응형

c언어 오버플로우 알아보기

네 안녕하세요, 이번 시간에는 c언어 오버플로우에 대하여 한 번 포스팅을 해보려고 합니다.

오버플로우는 말 그대로 무언가 넘쳐난다는 뜻을 가지고 있죠?

우리가 프로그래밍 로직을 작성하다 보면 특정 범위를 넘어가는 경우가 생기는데, 이럴 때 오버플로우가 발생한다고 그럽니다.

그래서 이 오버플로우가 무엇 때문에 일어나는지, 그리고 그게 일어나면 어떤 일이 발생하는지 한 번 써보려고 합니다.

그럼 지금부터 같이 보실까요?

 

1. 오버플로우

오버플로우는 보통 우리가 c언어를 작성할 때 정수형 변수를 이용할 때 나타나곤 합니다.

그 이유는 c언어에서 연산이 가능한 정수의 범위가 정해져 있기 때문입니다.

예를 들어서 우리가 c언어를 이용하여 정수를 연산을 한다고 할 때,

c언어 내에서 연산이 가능한 범주를 넘어서는 일이 발생할 수가 있는데,

그럴 경우에 오버플로우가 발생합니다.

그럼 간단한 예제 코드를 함께 보실까요?

#include <stdio.h>
#include <limits.h>

int main()
  
{
  short s_money = SHRT_MAX; //최데값으로 초기화(최대값 : 32767)
  unsigned short u_money = USHRT_MAX; // 최대값으로 초기화(최대값 : 65535)

  s_money = s_money + 1;
  printf("s_money = %d\n", s_money);

  u_money = u_money + 1;
  printf("u_money = %d\n", u_money);


  return 0;
}

이런 식으로 표현이 가능합니다.

여기에서 새로운 전처리 문을 하나 보실 수 있죠?

바로 #include <limits.h>인데요,

여기 보이는 limits.h 헤더 파일은 제한을 두는 것과 관련이 되어있는 헤더 파일이에요.

그래서 이 헤더 파일에 있는 내장 함수가 여기 적혀있는데, 그게 바로 SHRT_MAX, 그리고 USHRT_MAX입니다.

여기에 있는 MAX는 상한치를 나타내는 것이고, 반대로 MIN이 적힌다면 하한치를 나타내는 것입니다.

그래서 우리가 숫자를 세팅을 할 때 이렇게 적게 된다면 해당 변수가 가질 수 있는 수의 범위의 최댓값, 혹은 최솟값으로 잡아서 초기화를 하겠다는 의미가 됩니다.

그래서 이어서 설명을 드리자면, 여기에서는 short, 그리고 unsigned short가 가지는 수의 범위의 최댓값으로 잡은 겁니다.

그리고 오버플로우를 일부러 발생시키기 위해서 그 최댓값에 1을 더해서 출력을 했습니다.

그랬더니 결과는 이런 식으로 나왔습니다.

s_money = -32768
u_money = 0
반응형

 

이렇게 갑자기 수가 각각의 변수가 가지는 최솟값으로 바뀐 것을 볼 수가 있죠?

이렇게 나온 이유는 이미 연산 범위의 최대치로 초기화를 시켰는데, 그 상태에서 수를 더 늘리니 에러가 발생하여 이렇게 나온 것입니다.

그래서 이런 식의 결과가 나왔을 때, 다시 말해서 변수가 가지는 수의 범위를 넘어서는 결과가 나왔을 때 우리는 오버플로우가 일어났다고 합니다.

그리고 이렇게 오버플로우가 일어나면 다시 처음으로 돌아가서 연산을 시작하게 됩니다.

 

2. 오버플로우를 조심해야 하는 이유

우리가 오버플로우를 조심해야 하는 이유는 크게 두 가지가 있습니다.

첫 번째로, 우리가 이렇게 오버플로우와 관련이 된 에러를 낸다고 해도 컴파일러에서는 아무런 경고도 주지 않습니다.

그냥 있는 그대로 연산을 하고, 오버플로우가 나면 그렇게 나서 생긴 결과만을 낼 뿐입니다.

그래서 이를 인지하지 못하는 경우가 굉장히 많아서 프로그래머가 이 원인을 찾지 못하는 경우가 꽤 많기 때문에 우리 스스로가 오버플로우를 내지 않도록 조심해야 합니다.

두 번째로, 오버플로우는 우리가 컴퓨터를 해킹하고 공격할 때 쓰는 방법들 중 하나입니다.

아까 보여드린 결과 화면을 보시면 아실 수 있듯이, 연산 범위를 벗어나게 만드는 필요 이상의 데이터를 꽂아 넣는 공격을 가해서 일부러 오버플로우를 일어나게 한 다음에 컴퓨터를 망칩니다.

그렇게 되면 프로그램을 망치게 될뿐더러, 나중에는 컴퓨터 자체에 문제가 생길 수도 있기 때문입니다.

그래서 이러한 공격을 당하지 않게 정말 조심해야 합니다.

 

여기까지 오버플로우에 대하여 알아봤는데요,

다음 포스팅에서는 상수에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사합니다 ~

반응형

댓글