Microsoft MVP성태의 닷넷 이야기
VC++: 120. std::copy 등의 함수 사용 시 _SCL_SECURE_NO_WARNINGS 에러 발생 [링크 복사], [링크+제목 복사],
조회: 31263
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

std::copy 등의 함수 사용 시 _SCL_SECURE_NO_WARNINGS 에러 발생

std::copy를 다음과 같이 사용하면,

#include "stdafx.h"
#include <algorithm>

void func1()
{
    int a[] = { 1, 2, 3 };
    int b[3];
    std::copy(a, a + 3, b);
}

컴파일 에러가 없지만 포인터로 바꾸면,

void func1()
{
    int a[] = { 1, 2, 3 };
    int *b = new int[3];
    std::copy(a, a + 3, b);
}

다음과 같은 오류가 발생합니다.

Error C4996 'std::copy::_Unchecked_iterators::_Deprecate': Call to 'std::copy' with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' ConsoleApplication1 c:\program files (x86)\microsoft visual studio\2017\enterprise\vc\tools\msvc\14.11.25503\include\xutility 2294


왜냐하면, Buffer Overflow에 민감한 마이크로소프트는 이를 유발할 수 있는 함수들을 전부 "unsafe"로 규정해 "_Deprecate"로 처리했기 때문입니다.

template<class _InIt,
    class _OutIt> inline
    _OutIt copy(_InIt _First, _InIt _Last,
        _OutIt _Dest)
    {   // copy [_First, _Last) to [_Dest, ...)
    _DEPRECATE_UNCHECKED(copy, _Dest);
    return (_Copy_no_deprecate(_First, _Last, _Dest));
    }

즉, std::copy의 3번째 인자로 전달된 b 버퍼의 크기를 알 수 없기 때문에 복사 과정에서 b 버퍼의 크기를 넘는 보안 취약점이 발생하는 것입니다.

이 오류를 벗어나는 5가지 방법을 다음의 글에서 소개하고 있습니다.

Why am I getting these _SCL_SECURE_NO_WARNINGS messages?
; https://blogs.msdn.microsoft.com/vcblog/2017/05/05/why-am-i-getting-these-_scl_secure_no_warnings-messages/

가장 쉬운 방법은 전역 헤더 파일에 _SCL_SECURE_NO_WARNINGS 상수를 정의하는 것입니다.

#define _SCL_SECURE_NO_WARNINGS

이렇게 하면 기존의 소스 코드를 전혀 변경하지 않고 컴파일할 수 있습니다. 단지, 보안 취약점은 여전히 안고 간다는 문제가 있습니다. 소스 코드를 변경할 수 있다면 다음의 stdext 네임스페이스에 있는 함수를 쓰는 방법이 있습니다.

#include <iterator>

void func1()
{
    int a[] = { 1, 2, 3 };
    int *b = new int[3];
    std::copy(a, a + 3, stdext::checked_array_iterator<int *>(b, 3));
}

보는 바와 같이 checked_array_iterator는 b 버퍼의 크기가 3임을 알 수 있으므로 안전한 iterator를 반환하게 됩니다.




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







[최초 등록일: ]
[최종 수정일: 10/4/2017]

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

비밀번호

댓글 작성자
 




... 121  122  123  124  125  126  127  128  129  130  131  132  [133]  134  135  ...
NoWriterDateCnt.TitleFile(s)
1845정성태1/26/201539497Windows: 101. 제어판의 "Windows 자격 증명 관리(Manage your credentials)"를 금지시키는 방법
1844정성태1/26/201536388오류 유형: 269. USB 메모리의 용량이 비정상적으로 보여진다면? [7]
1843정성태1/24/201527458VC++: 87. 무시할 수 없는 Visual C++ 런타임 함수 성능
1842정성태1/23/201551654개발 환경 구성: 255. 노트북 키보드에 없는 BREAK 키를 다른 키로 대체하는 방법
1841정성태1/21/201524647오류 유형: 268. Win32 핸들 관련 CLR4 보안 오류 사례
1840정성태1/8/201533039오류 유형: 267. Visual Studio - CodeLens 사용 시 CPU 100% 현상
1839정성태1/5/201525547디버깅 기술: 69. windbg 분석 사례 - cpu 100% 현상 (2)
1838정성태1/4/201546623기타: 49. 윈도우 내레이터(Narrator) 기능 끄는 방법(윈도우에 파란색의 굵은 테두리 선이 나타난다면?) [4]
1837정성태1/4/201532197디버깅 기술: 68. windbg 분석 사례 - 메모리 부족 [1]
1836정성태1/4/201532392디버깅 기술: 67. windbg - 덤프 파일과 handle 정보
1835정성태1/3/201533693개발 환경 구성: 254. SQL 서버 역시 SSL 3.0/TLS 1.0만을 지원하는 듯!
1834정성태1/3/201558131개발 환경 구성: 253. TLS 1.2를 적용한 IIS 웹 사이트 구성
1833정성태1/3/201534518.NET Framework: 490. System.Data.SqlClient는 SSL 3.0/TLS 1.0만 지원하는 듯! [3]
1832정성태1/2/201525374오류 유형: 266. Azure에 응용 프로그램 게시 중 로그인 오류
1831정성태1/1/201534398디버깅 기술: 66. windbg 분석 사례 - cpu 100% 현상 (1) [1]
1830정성태1/1/201534107오류 유형: 265. svchost.exe 프로세스(IP Helper: IPHLPSVC)의 CPU 100% 현상
1829정성태12/16/201437502VC++: 86. Windows Vista부터 바뀐 Credential Provider 예제 분석 (2) [2]파일 다운로드1
1828정성태12/15/201434679VC++: 85. Windows Vista부터 바뀐 Credential Provider 예제 분석 (1) [4]파일 다운로드1
1827정성태12/12/201430751VC++: 84. CredUIPromptForWindowsCredentials Win32 API 사용법 정리
1826정성태12/11/201435159.NET Framework: 489. Socket.Listen에 전달된 backlog 인자의 의미 [6]
1825정성태12/11/201482930.NET Framework: 488. TCP 소켓 연결의 해제를 알 수 있는 방법 [10]파일 다운로드1
1824정성태12/10/201431586.NET Framework: 487. Socket.Receive 메서드의 SocketFlags.Peek 동작을 이용해 소켓 연결 유무를 확인? [8]파일 다운로드1
1823정성태12/10/201428986.NET Framework: 486. Java의 ScheduledExecutorService에 대응하는 C#의 System.Threading.Timer [2]
1822정성태12/3/201429712개발 환경 구성: 252. Xamarin 라이선스 관리 [8]
1821정성태12/1/201437578VS.NET IDE: 96. Visual Studio에서 /* ~ */ 주석을 위한 단축키(매크로)
1820정성태11/23/201424951.NET Framework: 485. Mono Profiler에서 IL 코드 변경이 가능할까? - 두 번째 이야기파일 다운로드1
... 121  122  123  124  125  126  127  128  129  130  131  132  [133]  134  135  ...