2010-02-23 6 views
7

std 복사 기능을 사용할 때 경고가 표시됩니다.std :: copy 사용 문제

내가 선언 한 byte 배열이 있습니다.

byte *tstArray = new byte[length]; 

는 그럼 난 선언과 내가 몇 가지 초기 사용자 입력에 따라 사용하고자하는 일부 16 진수 값으로 초기화되는 몇 가지 다른 바이트 배열이있다.

기본적으로 원래 입력을 구문 분석하는 데 사용하는 일련의 if 문이 있으며 일부 문자열을 기반으로 사용할 바이트 배열을 선택하고 원본 tstArray에 결과를 복사합니다. '표준 : : 사본': -이 호출되었는지 확인하는 호출자에 의존 매개 변수 와 함수 호출 가 안전하지 않을 수

if(substr1 == "15") 
{ 
    std::cout<<"Using byte array rated 15"<<std::endl; 
    std::copy(ratedArray15,ratedArray15+length,tstArray); 
} 

내가 얻을 경고가 경고 C4996은 다음과 같습니다 예를 들어

전달 된 값이 정확합니다.

가능한 해결책은 -D_SCL_SECURE_NO_WARNINGS를 사용하는 것이므로이 경고를 비활성화하는 것입니다. 글쎄, 그게 내가 연구하는 것이다.

하지만 내 코드가 실제로 안전하지 않고 실제로 확인해야 할 필요가 있는지 확실하지 않습니다.

+0

예 위한 (substr1 == "15") { 표준 : COUT << "(15)을 평가하여 바이트 배열"<< 경우 표준 : ENDL ... 코드 게시 얻을 수가 기울어 ; std :: copy (ratedArray15, ratedArray15 + length, tstArray); } – djones2010

+0

나는 당신을 위해 그것을 고쳤다. 코드를 게시하려면 코드 블록 앞뒤에 4 개의 공백을 들여 쓰고 개행 문자를 넣으십시오. 또한 편집기에 자동으로이를 수행하는 데 사용할 수있는 버튼이 있습니다. –

+0

많은 질문을했지만 질문 중 11 %에서 하나의 답변을 "올바른 답변"으로 받아들이려면 체크 표시 만 클릭했음을 의미합니다. –

답변

9

C4996은 __declspec(deprecated)으로 표시된 기능을 사용하고 있음을 의미합니다. 아마도 D_SCL_SECURE_NO_WARNINGS를 사용하면 #ifdef가 사용 중지됩니다. 헤더 파일을 읽으면 확실히 알 수 있습니다.

하지만 문제는 왜 사용되지 않는 이유입니까? MSDN은 std :: copy() 페이지에서 그것에 대해 아무 것도 말하지 않는 것 같지만 잘못된 것을보고있을 수 있습니다. 일반적으로이 작업은 XPSP2의 보안을 강화하는 동안 모든 "안전하지 않은 문자열 조작 함수"에 대해 수행되었습니다. 목적지 버퍼의 길이를 std :: copy에 전달하지 않기 때문에 너무 많은 데이터를 쓰려고하면 버퍼의 끝을 행복하게 쓸 것이다.

사용 여부가 안전하지 않은 경우 전체 코드를 검토해야합니다. 일반적으로이 방법으로 함수를 사용하지 않을 때 권장하는 안전한 버전이 있습니다. 다른 방법으로 문자열을 복사 할 수 있습니다. This article는 깊이 들어가 있습니다. 그들은 당신이 표준 OutputIterator 대신에 std :: checked_array_iterator를 사용해야 함을 암시하는 것처럼 보입니다. 같은

뭔가 :

stdext::checked_array_iterator<char *> chkd_test_array(tstArray, length); 
std::copy(ratedArray15, ratedArray15+length, chkd_test_array); 

(. 내가 바로 당신의 코드를 이해한다면)

+5

그러나'checked_array_iterator'는 표준이 아닙니다. – UncleBens

+1

그래, stdext는 재생할 재미있는 토지가 아니지만, 비추천 또한 표준이 아닙니다. 개인적으로 나는 문자 배열을 위해 std :: copy()를 사용할 필요가 없다. 대신 StringCchCopy()를 사용하는 편이 더 좋습니다. 휴대용 코드에서 비 MSFT 플랫폼에서 strncpy()를 사용하는 래퍼를 작성합니다. –

+0

이것이 가장 도움이되었습니다. 내가 조금 혼란스러워하는 유일한 이유는 http://msdn.microsoft.com/en-us/library/aa985928(VS.80).aspx 에 가서 _count (array_name)를 사용하는 것입니다. 컴파일러 오류 C2784 'declaration': 'type'에서 'type'에 대한 템플릿 인수를 추론 할 수 없습니다. 컴파일러는 제공된 함수 인수에서 템플릿 인수를 결정할 수 없습니다. 하지만이 경우 정확한 배열 크기를 사용할 때는 잘 작동합니다. 어떤 아이디어? 그것 이외에 그것은 가장 도움이되었다. – djones2010

4

기본적으로 tstArray은 "길이"요소를 보유 할만큼 큰 배열을 가리키고 있습니다. std::copy은이를 확인하지 않습니다.

1

글쎄, 내가 다음 stdlib의 마이크로 소프트의 일방적 인 중단도 std::copychar*을 전달 포함 가정합니다.

나는 그것의 부분이 몇 가지 장점이있다 가정 (그들은. 실제로 기능의 전체 범위를 엉망으로 한) (fopen() 글로벌 ERRNO 접촉, 그래서 스레드 안전을 아니에요)하지만, 다른 결정은 매우 합리적인 것 같지 않습니다.(나는 그들이 모든 일에 너무 큰 땀을 흘렸다 고 말하고 싶습니다. 쓰레드 안전하지 않고 체크 할 수없는 것과 같은 레벨이 있어야합니다.)

각 기능마다 MS-doc을 읽는 것이 좋습니다. 당신은 각 사건에 대한 이슈를 알고 싶어하지만, 각 기능이 그 경고를 갖는 이유는 꽤 잘 문서화되어 있으며 그 원인은 대개 각각 다릅니다.

-1

적어도 VC++ 2010 RC는 기본 경고 수준에서 해당 경고를 방출하지 않는 것으로 보입니다.

+0

경고를 무시하는 것은 해결책이 아닙니다. 최소한 경고를 무시하기 전에 경고가 발생하는 이유를 이해해야합니다. –

+1

나는 이것을 무시하지 않고있다. 나는 단순히 VC++ 2010 RC가 더 이상 방출하지 않는다고 말하고있다. –