35. checked / unchecked 컨텍스트와 정수 오버플로의 내부 동작
난이도 중 해설 보기 →
결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커
(A)(B) 는 주목 위치 힌트다.
결함 코드 · C#
// 주제: checked / unchecked 컨텍스트와 정수 오버플로의 내부 동작
//
// 게임 서버는 골드/경험치/시퀀스 번호 등 정수 연산이 많다. 오버플로가 조용히
// 감싸이면(wrap) 재화 복사·롤백 같은 심각한 버그가 된다. C# 의 checked/unchecked
// 규칙과 컴파일러의 상수 폴딩을 정확히 이해해야 한다.
//
// 과제:
// 1) 아래 RuntimeOverflow 의 두 출력(기본 컨텍스트 vs checked)은 각각 무엇인가?
// IL 수준에서 add 와 add.ovf 가 어떻게 다른지 설명하라.
// 2) 주석 처리된 CompileTimeConst 의 두 줄 중, 컴파일 에러가 나는 것은 무엇이고
// 왜인가? (상수식의 기본 오버플로 검사 규칙)
// 3) 프로젝트 전역 옵션 <CheckForOverflowUnderflow> 와 지역 checked/unchecked 의
// 관계, 그리고 게임 재화 연산에서 권장 방침을 설명하라.
//
// (동작을 예측한 뒤 설명은 answer.md 를 참조하라. 실행 환경이 있으면 확인하라.)
using System;
public static class OverflowDemo
{
public static void RuntimeOverflow()
{
int max = int.MaxValue;
int wrapped = max + 1; // (A) 기본 컨텍스트
Console.WriteLine($"unchecked: {wrapped}");
try
{
int bad = checked(max + 1); // (B) checked
Console.WriteLine($"checked: {bad}");
}
catch (OverflowException)
{
Console.WriteLine("checked: OverflowException");
}
}
// 아래 두 줄은 컴파일 시점 상수식이다. 어느 쪽이 컴파일되는가?
public static void CompileTimeConst()
{
// const int a = int.MaxValue + 1; // (C)
// const int b = unchecked(int.MaxValue + 1); // (D)
}
// 실전: 골드 합산이 오버플로하면 어떻게 되어야 하나?
public static long AddGold(int current, int delta)
{
return current + delta; // (E)
}
} 내 리뷰 · C#
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.