설명
작은 정수 타입 값을 타입 비트 수 이상으로 시프트하면 Go의 시프트 및 정수 변환 규칙에 따라 계산되지만, 개발자가 의도한 값과 다른 결과가 발생할 수 있습니다. 실제 영향은 결과가 마스크, 크기 또는 다른 계산에 어떻게 사용되는지에 따라 달라집니다.
잠재적 영향
- 마스크, 플래그, 크기 계산이 잘못되어 프로그램이 의도와 다르게 동작할 수 있습니다.
- 상수 계산이 코드 리뷰에서 쉽게 누락될 수 있습니다.
해결 방법
- 시프트 폭과 왼쪽 피연산자 타입의 비트 수를 함께 확인하세요.
- 필요한 경우 더 큰 정수 타입으로 먼저 변환하고, 입력과 계산 결과의 범위도 검증하세요.
예시
변경 전
go
value := int32(n) << 40
변경 후
go
value := int64(n) << 40
설명:
- 변경 전: 32비트 정수 값을 32비트 이상 시프트한 결과는 개발자가 기대한 64비트 계산과 다를 수 있습니다.
- 변경 후: 먼저
int64로 변환해 40비트 시프트를 더 큰 타입에서 수행합니다. 입력값과 최종 결과도 해당 타입의 범위 안에 있는지 확인해야 합니다.