2010-08-18 3 views
1
WCHAR* someString = L"SomeString\n"; 
WCHAR s1[MAX_PATH]; 

// I'm sure this is right code. 
StringCchCopyW(s1, _countof(s1), someString); 

// But I'm not sure about these example. 
StringCchCopyW(s1 + 100, _countof(s1) - 100, someString); // Is it right? 
StringCchCopyW(s1 + 100, _countof(s1), someString); // Is it right? 

// How about these? 
StringCchCatW(s1, _countof(s1) - wcslen(s1), someString); // Is it right? 
StringCchCatW(s1, _countof(s1), someString); // Is it right? 

답변

1

모든 기능에있어 한 가지 잘못된 점은 반환 값을 확인하는 것을 잊었습니다. String Safe 함수조차도 실패 할 수 있으며 그렇게하면 코드에서 자동으로 종료됩니다. 문자열 함수의 반환 값은 이고 항상이어야합니다. 그렇지 않으면 보안 구멍을 열었습니다.

그 외에도 미묘한 문제가 있으므로 결정적인 예 또는 아니오로 답하기가 정말 어렵습니다.

StringCchCopyW(s1, _countof(s1), someString); 

이것은 정확하며 무시 된 반환 값 이외의 실제 문제는 없습니다.

StringCchCopyW(s1 + 100, _countof(s1) - 100, someString); // Is it right? 

답변하기가 어렵습니다. 이 작업을 수행하면 s1+100은 유효한 문자열 객체를 가리키지 만 s1에는 아무런 영향을주지 않습니다. 보안 구멍을 열지는 않습니다.

StringCchCopyW(s1 + 100, _countof(s1), someString); // Is it right? 

이것은 매우 잘못되었습니다. 유효한 문자의 수는 MAX_PATH이지만, MAX_PATH-100 자의 버퍼가 있습니다. someString이 충분히 길면 버퍼 오버 플로우가 발생할 수 있습니다.

StringCchCatW(s1, _countof(s1) - wcslen(s1), someString); // Is it right? 

이것은 잘못되었지만 그렇게 위험하지는 않습니다. s1의 길이가 실제로는 그보다 작다고보고하고 있습니다. 오버플로는 발생하지 않지만 유효한 문자열은 추가되지 않습니다.

StringCchCatW(s1, _countof(s1), someString); // Is it right? 

s1의 문자열이 올바른 경우에 한해 올바른 내용입니다. s1에 유효한 문자열이 없으면 함수가 잘못 실행될 수 있습니다.

+0

분명합니다. 감사. – Benjamin

+0

그건 그렇고, 당신은 VsVim을 개발 한 사람입니다! 그것은 굉장. 인생이 바뀌고 있습니다 :) – Benjamin

+0

@ 벤자민, VsVim을 즐기고 있다는 소식을 듣고 기쁩니다! – JaredPar