Swimmer

[C언어] 변수의 유효 범위 (variable scope) 본문

개념공부/C, C++

[C언어] 변수의 유효 범위 (variable scope)

Zach Choi 2023. 7. 3. 21:57

아래는 문제가 있는 코드로 정적검증을 돌려보면 높은 위험성의 코드로 분류될 수 있다. 무엇이 문제인지 모르겠다면 변수의 유효 범위에 대한 공부가 필요하다. 변수의 유효 범위란 OS가 변수의 메모리를 할당 및 유지해주는 영역, 범위를 말한다. 유효 범위를 벗어나면 OS에서는 변수의 메모리를 해제한다.


지역 변수의 유효 범위

지역 변수는 선언된 블록 내에서만 유효하다(메모리가 할당된 채 유지된다). 블록은 중괄호 {} 내 영역이다. 함수도 하나의 블록이다.

위 그림에서 pVar1 포인터 변수는 main {} 블럭과 if {} 블럭에서 모두 유효하다. 이는 메모리가 할당되어 있는 것이고, 조사식을 통해 변수의 값을 확인할 수 있다.

하지만 Var2 변수는 if{} 블럭에서만 유효하고 main {} 블럭에서는 유효하지 않다. 따라서 if{} 블럭에서는 Var2의 값을 조사식으로 추적할 수 있지만, 해당 블럭을 빠져나오게 되면 추적할 수 없다.

 

그렇다면 위의 코드는 어떤 문제가 있을까?

if{} 블럭을 빠져나온 뒤에 pVar1 포인터 변수에 이미 메모리가 해제된 Var2의 메모리 주소 값이 저장되어 있는 것이 문제이다. 더군다나 메모리가 해제된 주소에 접근하여 값을 (3)으로 새로 쓰고 있다. 이는 메모리 침범의 원인이 된다. 이로 인해 정적검증 결과 해당 코드는 높은 위험성의 코드로 분류 된다. 변수의 유효 범위는 특히 포인터 변수를 다루는데 있어 유의해야 한다.

 

그렇다면 어떻게 코드를 짜야 할까? 

아래와 같이 지역변수는 함수의 가장 상단에 선언해야 한다. 그래서 보통 Coding Rule로 지역 변수는 함수의 가장 상단에 선언하도록 규제한다.


전역 변수의 유효 범위

전역 변수는 선언된 소스코드 파일 내 어느 위치에서든, 블록에 관계 없이 유효하다. 프로그램이 종료될 때 전역 변수의 메모리는 해제된다.

전역 변수는 초기화하지 않고 선언 시 0으로 자동 초기화 된다.

따라서 전역 변수의 메모리 주소를 사용하는 것은 크게 문제 되지 않지만, 오히려 전역 변수가 지역 변수의 메모리 주소를 저장하는 코드는 버그의 가능성이 존재하게 된다.


정적 변수의 유효 범위

정적 변수란 Static을 사용해 선언한 변수이다.

정적 변수는 초기화와 함께 메모리가 할당된 후, 블록을 나가더라도 메모리가 유지된다. 그리고 프로그램 종료 시 메모리가 해제된다. 이는 전역 변수와 동일한 특징이다.

하지만 정적 변수는 선언된 블록 내에서만 접근 가능하다. 이는 지역 변수와 동일한 특징이다.

'개념공부 > C, C++' 카테고리의 다른 글

2차원 Vector Sort 방법  (0) 2023.08.10
Bitwise Operation, Operator (비트연산)  (0) 2023.01.17
[C++ STL] unordered_map  (0) 2023.01.16
[C++ STL] map  (0) 2023.01.16
[LeetCode] 1. Two Sum  (1) 2023.01.09
Comments