Visual Studio 프로젝트 옵션 중 Basic Runtime Checks가 있다.

이 옵션은 개발자가 저지르기 쉬운(하지만 찾기 어려운) 버그를 런타임 과정에서 찾아주는 기능이다.

 

프로젝트 설정의 C/C++ → Code Generation에서 설정이 가능하다. 

그림 1.  Basic Runtime Checks 옵션 설정 창

그림 1과 같이 Defualt, /RTCs, /RTCu, RTC1 중 하나를 선택할 수 있다.

본 문서에서는 각 옵션 별 동작을 설명한다.

1. Stack Frames (/RTCs)

이 설정은 버퍼 오버플로우 발생 여부를 체크한다.

버퍼 오버플로우는 단순히 프로그램의 오동작을 일으킬 뿐만 아니라 버퍼 오버런 공격에 사용될 수도 있으므로 매우 유의해야 하지만

개발 과정에서 놓치기 쉽고, 디버깅도 쉽지 않은 버그 중 하나이다.

 

다음은 고의로 버퍼 오버플로우를 발생시킨 상황이다.

[그림 2. 버퍼 오버플로우 고의 발생]

그림 2를 보면 pszMsg 배열에 할당된 메모리 주소는 0x3efcb0 ~ 0x3ecb2까지 3바이트인데 0x3ecb3도 00으로 설정이 된 걸 볼 수 있다. 이렇게 버퍼 오버플로우가 발생하면 이후 프로그램의 정상 동작을 보장하기 어렵게 된다.

 

'/RTCs' 옵션은 이러한 오버 플로우 발생을 방지한다.

'/RTCs'를 설정할 경우 지역변수 선언 시 스택에서 해당 변수 앞뒤의 메모리를 0xCC로 변경하고 이후 그 값이 변경되었는지를 검사한다.

만약 값이 변경이 되면 오버런 또는 언더런이 발생했다고 판단하고 예외를 발생시킨다.

[그림 3. 변수 생성 시 메모리 초기화]

그림 3을 보면 지역변수 pszMsg의 앞뒤로 메모리가 0xCC로 초기화되는 것을 확인할 수 있다.

[그림 4. 오버 플로우 발생 시 메모리]

그림 4에서 pszMsg에 할당된 메모리를 벗어난 0x10ffd67 영역이 0으로 변경되었고, 프로그램을 이를 감지하여 예외를 발생시킨다.

[그림 5. 버퍼 오버플로우 중단 창]

2. Uninitialized Variables (/RTCu)

이 설정은 초기화하지 않은 변수를 사용하고 있는지 체크한다.

/RTCu 설정을 하지 않으면 초기화되지 않은 변수를 사용하더라도 (운이 좋으면)프로그램은 동작하는데

설정을 할 경우에는 바로 예외를 발생시킨다.

3. Both (/RTC1, equiv. to /RTCsu)

이 설정은 /RTCs와 /RTCu 옵션을 모두 사용하는 설정이다.

4. Default

Default를 설정할 경우 모든 Runtime Check를 사용하지 않는다.

Proxy를 통해야만 인터넷이 되는 환경에서 RStudio를 사용하기 위해서는 R 설정에서 Proxy 정보를 추가해야 한다.

 

RStudio Server는 R_HOME/etc/Renviron.site 에 추가하면 되고, RStudio Desktop은 ~/.Renviron 에 추가하면 된다. 

(R_HOME의 경로는 R.home() 명령으로 확인할 수 있다.)

 

RStudio에서 다음 명령어로 쉽게 수정할 수 있다.

file.edit('~/.Renviron')

위 명령어로 스크립트 창이 열리면 아래 내용을 추가한다.

http_proxy=http://proxy.dom.com/
http_proxy_user=user:passwd

https_proxy=https://proxy.dom.com/
https_proxy_user=user:passwd

http_proxy_user 또는 https_proxy_user 는 Proxy에서 계정을 통해 인증을 해야 하는 경우에만 추가하면 된다.

 

적용 후 RStudio를 재시작하면 인터넷 연결이 가능하다.

 

참조: https://support.rstudio.com/hc/en-us/articles/200488488-Configuring-R-to-Use-an-HTTP-or-HTTPS-Proxy

Windows 8 이상에서는 '전체 종료(full shutdown)', '빠른 부팅 종료(fast startup)', '절전모드(hybernate)' 세 가지로 시스템을 종료할 수 있다.

시스템 종료 방법 설명
full shutdown 시스템을 완전히 종료한다. 장기간 PC를 사용하지 않을 경우 전체 종료를 권장한다.
fast startup 빠른 부팅이 가능한 종료를 진행한다. hybernate보다 부팅이 빠르다.
hybernate laptop 환경을 고려하여 디자인 되었으며, 적은 전력을 사용하도록 sleep 상태로 들어간다.

언뜻 생각하기에 '시스템 종료' 버튼을 누를 경우 시스템 전체가 종료(full shutdown)될 것 같지만,

Windows 8 이상에서는 기본적으로 fast startup으로 종료된다. 제어판 '전원 옵션'에서 '빠른 시작 켜기'를 체크 해제해야 full shutdown을 한다.

 

fast startup으로 재부팅할 경우 서비스가 종료하지 않고 멈추었다가 부팅 후 동작을 이어가게 되는 등 시스템 종료 방법에 따라 일부 동작의 차이가 발생할 수 있다.

 

만약 마지막 부팅이 fast startup으로 부팅이 되었는지를 확인하고 싶다면 PowerShell에서 아래 명령을 실행하면 된다.

Get-WinEvent -ProviderName Microsoft-Windows-Kernel-boot -MaxEvents 10 | Where-Object {$_.id -like “27”}

위 명령을 실행하면 부팅 유형 값이 출력되는데 각 값은 아래와 같다.

부팅 유형 설명
0x0 cold boot from full shutdown
0x1 hybrid boot(fast startup)
0x2 resume from hibernate

 

+ Recent posts