[시큐어코딩 가이드] 2-5-2. 부적절한 자원 해제

부적절한 자원 해제

정의

프로그램의 자원(힙 메모리, 소켓 등)을 할당받아 사용을 마치고 더 이상 사용하지 않는 경우에는 적절히 반환해야 하는데, 프로그램 오류 또는 에러로 사용이 끝난 자원을 반환하지 못하는 경우에 문제가 발생할 수 있습니다.

 

안전한 코딩기법

자원을 획득하여 사용한 다음에는 반드시 자원을 해체 후 반환해야 합니다.

 

코드예제

다음은 안전하지 않은 코드예제입니다. try문 내의 코드 실행 중 오류가 발생할 경우, close() 메서드가 실행되지 않아 사용한 자원이 반환되지 않는 경우를 보여주는 코드입니다.

#부적절한 자원 해제(안전X)
def get_config_bad():
    lines = None
    try:
        f = open('config.cfg')
        lines = f.readlines()
        raise Exception('Throwing the exception!')
        f.close()
        return lines
    except Exception as e:
        return ''

 

다음은 안전한 코드예제로, 예외가 발생하여 함수가 종료될 때, 예외여부와 상관없이 항상 실행되는 finally문을 사용하는 코드입니다.

#부적절한 자원 해제(안전O)
def get_config_good():
    lines = None
    try:
        f = open('config.cfg')
        lines = f.readlines()
        raise Exception('Throwing the exception!')
    except Exception as e:
        return ''
    finally:
        f.close()
        return lines

 

 

 

코드오류/부적절한 자원 해제

[참고문헌] Python 시큐어코딩 가이드(2022) / KISA(한국인터넷진흥원)