Microsoft MVP성태의 닷넷 이야기
.NET Framework: 789. C# 컴파일 옵션 - Check for arithmetic overflow/underflow [링크 복사], [링크+제목 복사],
조회: 15196
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 3개 있습니다.)

C# 컴파일 옵션 - Check for arithmetic overflow/underflow

아래의 글 덕분에 처음으로 overflow/underflow에 대해 심각하게 생각해 보았습니다. ^^

오버플로우와 언더플로우
; https://www.sysnet.pe.kr/3/0/5019

위의 의견에 따르면, (예를 들어) MaxValue + 1일 때의 상황이 overflow라고 불리기도 하지만 (예를 들어) MinValue - 1일 때의 상황 역시 overflow입니다. 실제로 wiki 정의에서도 이것을 찾아볼 수 있습니다.

Integer overflow
; https://en.wikipedia.org/wiki/Integer_overflow

In computer programming, an integer overflow occurs when an arithmetic operation attempts to create a numeric value that is outside of the range that can be represented with a given number of bits - either larger than the maximum or lower than the minimum representable value.


그리고 옵션 명에도 나오지만 특히나 "arithmetic underflow"는,
Arithmetic underflow
; https://en.wikipedia.org/wiki/Arithmetic_underflow

The term arithmetic underflow (or "floating point underflow", or just "underflow") is a condition in a computer program where the result of a calculation is a number of smaller absolute value than the computer can actually represent in memory on its CPU.

Arithmetic underflow can occur when the true result of a floating point operation is smaller in magnitude (that is, closer to zero) than the smallest value representable as a normal floating point number in the target datatype.[1] Underflow can in part be regarded as negative overflow of the exponent of the floating point value. For example, if the exponent part can represent values from ?128 to 127, then a result with a value less than ?128 may cause underflow.


이렇게 부동 소수점에서 (0인 듯 0이 아닌 0 같을 정도로) 0에 가까운 값이지만 정밀도로 표현할 수 없어 그냥 0으로 설정해 버리는 경우를 의미합니다.




이건 그냥 제 생각이지만, 해당 옵션의 문자열을 지정한 마이크로소프트 측의 개발자는 여기서의 underflow를 "integer underflow"로 여겼을 가능성이 크고, 아래의 링크에서와 같이 많은 글들이 (암묵적으로) MinValue보다 값이 낮아졌을 때의 상황을 의미하는 단어로 쓴 것 같습니다.

CWE-191: Integer Underflow (Wrap or Wraparound)
; https://cwe.mitre.org/data/definitions/191.html

Java SE 8's New Compact Profiles and Integer APIs
; http://www.informit.com/articles/article.aspx?p=2216988

Overflow And Underflow of Data Types in Java 
; https://dzone.com/articles/overflow-and-underflow-dat

Integer Overflow/Underflow and Floating Point Imprecision.
; https://medium.com/@taabishm2/integer-overflow-underflow-and-floating-point-imprecision-6ba869a99033

Integer underflow
; https://scc.ustc.edu.cn/zlsc/sugon/intel/ssadiag_docs/pt_reference/references/sc_int_underflow.htm

재미있는 것은, MSIL 코드를 보면 빼기(Subtract) 연산에서 overflow라는 의미의 "Ovf" 접두사를 넣었다는 것입니다.

OpCodes.Sub_Ovf 필드
; https://docs.microsoft.com/en-us/dotnet/api/system.reflection.emit.opcodes.sub_ovf

IL 코드 설계자가 Add_Ovf와 함께 빼기에서도 (Sub_Udf가 아닌) Sub_Ovf를 사용했다는 것은 overflow의 엄밀한 의미를 알고 지킨 것 같습니다.

또한, "OpCodes.Sub_Ovf 필드" 도움말 내용을 보면,

This operation is performed on signed integers; for floating-point values, use Sub.

부동 소수점에 대해서는 ovf 성격의 연산을 지원하지 않고 정수형에 대해서만 지원합니다. 그리고 Sub 명령어의 도움말을 보면,

Floating-point overflow returns +inf (PositiveInfinity) or -inf (NegativeInfinity).

부동 소수점의 경우 overflow 예외를 발생시키지 않는다고 나오며 underflow는 언급조차 안 하고 있습니다.

즉, .NET에서는 부동 소수점에서의 overflow/underflow에 대한 예외는 발생하지 않습니다. 실제로 "Check for arithmetic overflow/underflow" 옵션을 켜고 부동 소수점 빼기/나누기 등을 해보면, 단순하게 sub, div IL 명령어로만 대체될 뿐 ovf 의미의 IL 코드가 사용되지 않습니다.




종합해 봤을 때, 프로젝트 속성 창의 "Check for arithmetic overflow/underflow"에서의 underflow 의미는 (MinValue - 1 상황에서 발생하는) "integer underflow"를 의미하는 것 같습니다. 일단, 이에 대해서는 다음의 이슈를 통해 마이크로소프트에 문의를 해두었으니,

Is "Check for arithmetic overflow/underflow" option name valid?  #3792 
; https://github.com/dotnet/project-system/issues/3792

추이를 지켜보고 향후 진도를 나가는 것이 좋겠다는 판단입니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/13/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2020-02-06 08시43분
비주얼 스튜디오 16.6에 "underflow" 문구가 삭제될 거라고 합니다. ^^

Remove "underflow" from /checked description
; https://github.com/dotnet/project-system/pull/5855
정성태
2021-03-18 12시53분
오늘 문득 확인을 하게 되었는데, 옵션 명이 "Check for arithmetic overflow"로 바뀌었습니다.
정성태

... 61  62  63  64  [65]  66  67  68  69  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
12020정성태9/11/201914498VC++: 134. SYSTEMTIME 값 기준으로 특정 시간이 지났는지를 판단하는 함수
12019정성태9/11/20199843Linux: 23. .NET Core + 리눅스 환경에서 Environment.CurrentDirectory 접근 시 주의 사항
12018정성태9/11/20198844오류 유형: 567. IIS - Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive. (D:\lowSite4\web.config line 11)
12017정성태9/11/201911883오류 유형: 566. 비주얼 스튜디오 - Failed to register URL "http://localhost:6879/" for site "..." application "/". Error description: Access is denied. (0x80070005)
12016정성태9/5/201912854오류 유형: 565. git fetch - warning: 'C:\ProgramData/Git/config' has a dubious owner: '(unknown)'.
12015정성태9/3/201916730개발 환경 구성: 457. 윈도우 응용 프로그램의 Socket 연결 시 time-out 시간 제어
12014정성태9/3/201911187개발 환경 구성: 456. 명령행에서 AWS, Azure 등의 원격 저장소에 파일 관리하는 방법 - cyberduck/duck 소개
12013정성태8/28/201913975개발 환경 구성: 455. 윈도우에서 (테스트) 인증서 파일 만드는 방법 [3]
12012정성태8/28/201917860.NET Framework: 859. C# - HttpListener를 이용한 HTTPS 통신 방법
12011정성태8/27/201916104사물인터넷: 57. C# - Rapsberry Pi Zero W와 PC 간 Bluetooth 통신 예제 코드파일 다운로드1
12010정성태8/27/201911344VS.NET IDE: 138. VSIX - DTE.ItemOperations.NewFile 메서드에서 템플릿 이름을 다국어로 설정하는 방법
12009정성태8/26/201911924.NET Framework: 858. C#/Windows - Clipboard(Ctrl+C, Ctrl+V)가 동작하지 않는다면?파일 다운로드1
12008정성태8/26/201911689.NET Framework: 857. UWP 앱에서 SQL Server 데이터베이스 연결 방법
12007정성태8/24/201910847.NET Framework: 856. .NET Framework 버전을 올렸을 때 오류가 발생할 수 있는 상황
12006정성태8/23/201914066디버깅 기술: 129. guidgen - Encountered an improper argument. 오류 해결 방법 (및 windbg 분석) [1]
12005정성태8/13/201912018.NET Framework: 855. 닷넷 (및 VM 계열 언어) 코드의 성능 측정 시 주의할 점 [2]파일 다운로드1
12004정성태8/12/201919825.NET Framework: 854. C# - 32feet.NET을 이용한 PC 간 Bluetooth 통신 예제 코드 [14]
12003정성태8/12/201912558오류 유형: 564. Visual C++ 컴파일 오류 - fatal error C1090: PDB API call failed, error code '3'
12002정성태8/12/201911534.NET Framework: 853. Excel Sheet를 WinForm에서 사용하는 방법 - 두 번째 이야기 [5]
12001정성태8/10/201916039.NET Framework: 852. WPF/WinForm에서 UWP의 기능을 이용해 Bluetooth 기기와 Pairing하는 방법 [1]
12000정성태8/9/201914919.NET Framework: 851. WinForm/WPF에서 Console 창을 띄워 출력하는 방법파일 다운로드1
11999정성태8/1/201910666오류 유형: 563. C# - .NET Core 2.0 이하의 Unix Domain Socket 사용 시 System.IndexOutOfRangeException 오류
11998정성태7/30/201911884오류 유형: 562. .NET Remoting에서 서비스 호출 시 SYN_SENT로 남는 현상파일 다운로드1
11997정성태7/30/201913416.NET Framework: 850. C# - Excel(을 비롯해 Office 제품군) COM 객체를 제어 후 Excel.exe 프로세스가 남아 있는 문제 [2]파일 다운로드1
11996정성태7/25/201915840.NET Framework: 849. C# - Socket의 TIME_WAIT 상태를 없애는 방법파일 다운로드1
11995정성태7/23/201918918.NET Framework: 848. C# - smtp.daum.net 서비스(Implicit SSL)를 이용해 메일 보내는 방법 [2]
... 61  62  63  64  [65]  66  67  68  69  70  71  72  73  74  75  ...