경고 C26459
안전하지 않을 수 있는 '%position%' 위치의 원시 포인터 매개 변수를 사용하여 STL 함수 '%function%'을 호출했습니다. 이는 전달된 값이 올바른지 확인하는 호출자에 따라 다릅니다. 범위를 gsl::span으로 래핑하고 범위 반복기(stl.1)로 전달하는 것이 좋습니다.
설명
범위를 벗어난 쓰기는 원격 코드 실행 취약성의 주요 원인 중 하나입니다. 한 가지 해결 방법은 gsl::span
과 같은 범위 검사 데이터 구조를 사용하는 것입니다. 이 경고는 STL(표준 템플릿 라이브러리) 알고리즘이 원시 포인터에서 출력 범위로 작동하는 경우를 식별합니다. 원시 포인터는 경계가 확인되지 않습니다. 취약성을 방지하려면 대신 gsl::span
을 사용합니다.
코드 분석 이름: NO_RAW_POINTER_IN_STL_RANGE_CHECKED
예시
다음 코드는 경계 검사가 없고 copy_if
가 제공된 스토리지를 넘어서 쓰기 때문에 정의되지 않은 동작을 보여 줍니다.
void f()
{
std::vector<int> myints = { 10, 20, 30, 40, 50, 60, 70 };
int mydestinationArr[7] = { 10, 20, 80 };
std::copy_if(myints.begin(), myints.end(), mydestinationArr, [](int i) { return !(i<0); }); // Warning: C26459
}
경고를 수정하려면 gsl::span
을 사용하여 출력 범위가 경계로 선택되었는지 확인합니다.
void f()
{
std::vector<int> myints = { 10, 20, 30, 40, 50, 60, 70 };
int mydestinationArr[7] = { 10, 20, 80 };
gsl::span<int> mySpan{mydestinationArr};
std::copy_if(myints.begin(), myints.end(), mySpan.begin(), [](int i) { return !(i<0); }); // No warning
}