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#
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.