부적절한 자원 해제
정의
프로그램의 자원(힙 메모리, 소켓 등)을 할당받아 사용을 마치고 더 이상 사용하지 않는 경우에는 적절히 반환해야 하는데, 프로그램 오류 또는 에러로 사용이 끝난 자원을 반환하지 못하는 경우에 문제가 발생할 수 있습니다.
안전한 코딩기법
자원을 획득하여 사용한 다음에는 반드시 자원을 해체 후 반환해야 합니다.
코드예제
다음은 안전하지 않은 코드예제입니다. 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(한국인터넷진흥원)