설명
NumPy의 int8, int16, int32, int64 같은 고정 폭 정수 타입은 범위를 초과하면 값이 래핑될 수 있습니다. 값을 검증하지 않고 금액, 크기, 반복 횟수 계산에 사용하면 의도와 다른 값이 만들어질 수 있습니다.
잠재적 영향
- 크기나 횟수 계산이 예상보다 작아져 제한 로직이 잘못 동작할 수 있습니다.
- 음수나 래핑된 값으로 결제, 할당, 수치 처리 로직이 잘못 동작할 수 있습니다.
해결 방법
np.iinfo(dtype)로 허용 범위를 확인한 뒤 계산합니다.- 정확성이 필요한 값은 Python
int또는 충분히 큰 타입으로 처리하고 결과 범위를 다시 검증합니다.
예시
아래는 음이 아닌 정수의 결과 범위를 검사하는 예시입니다. 외부 입력으로 큰 거듭제곱을 계산한다면 메모리와 처리 시간을 제한하도록 입력 크기와 지수의 상한도 별도로 정하세요.
변경 전
python
result = np.power(number, pow_value, dtype=np.int64)
변경 후
python
limit = np.iinfo(np.int64).max
base = int(number)
exponent = int(pow_value)
if base < 0 or exponent < 0:
raise ValueError("unsupported input")
result = base ** exponent
if result > limit:
raise ValueError("too large")
설명:
- 변경 전: NumPy의 int8, int16, int32, int64 같은 고정 폭 정수 dtype으로 산술 연산을 수행하면 Python int와 달리 범위를 넘는 값이 래핑될 수 있습니다.
- 변경 후: Python
int로 계산한 뒤 결과가 고정 폭 dtype의 범위 안에 있는지 확인해 래핑된 NumPy 정수가 이후 계산에 쓰이지 않게 합니다.