[시큐어코딩 가이드] 2-3-2. 종료되지 않는 반복문 또는 재귀 함수

종료되지 않는 반복문 또는 재귀 함수

정의

재귀함수의 순환 횟수를 제어하지 못해 할당된 메모리나 프로그램 스택 등의 자원을 개발자가 의도한 범위보다 과도하게 초과하여 사용하면 위험합니다. 기본 케이스가 정의되어 있지 않은 재귀함수는 무한 루프에 빠지게 되고 자원고갈을 유발함으로써 시스템의 정상적인 서비스를 제공할 수 없게 합니다.

 

안전한 코딩기법

모든 재귀 호출 시 호출 횟수를 제한하거나 재귀함수 종료조건을 명확히 정의하여 호출을 제어해야 합니다.

 

코드예제

다음은 안전하지 않은 코드예제로, 재귀문을 빠져나오는 조건을 정의하지 않아 시스템 장애를 유발할 수 있는 코드입니다.

#종료되지 않는 반복문 또는 재귀 함수(안전X)
def factorial_bad(num):
    return num * factorial_bad(num - 1)
    
if __name__ == '__main__':
    itr = 5
    result = factorial_bad(itr)
    print(str(itr) + ' 팩토리얼 값은 : ' + str(result))

 

다음과 같이 오류가 발생합니다.

 

다음은 안전한 코드예제로, 특정 조건 또는 횟수에 따라 재귀함수를 중단하여 무한 반복에 빠지지 않도록 해야 합니다.

#종료되지 않는 반복문 또는 재귀 함수(안전0)
def factorial_good(num):
    if (num == 0):
        return 1
    else:
        return num * factorial_good(num - 1)

if __name__ == '__main__':
    itr = 5
    result = factorial_good(itr)
    print(str(itr) + ' 팩토리얼 값은 : ' + str(result))
    
#출력값
#5 팩토리얼 값은 : 120

 

 

 

시간 및 상태/종료되지 않는 반복문 또는 재귀 함수

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