다음을 통해 공유


경고 C28750

lstrlen 및 해당 변형의 사용 금지: '*function-name'은 향상된 오류 처리 목적으로 금지된 API입니다.

이 경고는 금지되었으며 보다 강력하거나 안전한 대체 기능이 있는 함수가 사용되고 있음을 나타냅니다. 이 특정 오류는 lstrlen 또는 해당 변형의 사용을 나타냅니다.

설명

lstrlen 함수 및 해당 변형은 예외를 전송하지 못하기 때문에 금지됩니다. 이로 인해 오류 조건이 훨씬 나중에 다른 스레드에서 발생할 수 있습니다. 이렇게 하면 오류 조건을 진단하기가 더 어려워집니다. 또한 컴파일러에서 동등한 대체 함수를 최적화하고 예외 처리기(__try 및 __except 블록)의 성능 오버헤드를 방지할 수 있습니다.

올바른 완화 방법은 더 안전한 문자열 길이 함수(일반적으로 strlen, wcslen, _tcslen)를 사용하는 것입니다. 그러나 lstrlen 변경 내용을 검토하는 동안 문자열 버퍼가 신뢰할 수 있는 코드에서 오는지 확인해야 합니다. 신뢰할 수 없는 데이터를 처리하는 경우 대신 함수의 strlen 제품군에서 strnlen 제품군(또는 StringCchLength 제품군)으로 전환해야 합니다. 그러면 신뢰할 수 없는 데이터 블록의 범위를 벗어나지 않도록 해야 합니다.

lstrlen과 달리 대체 항목은 예외를 catch하지 않습니다. 또한 lstrlen은 대체하지 않는 동안 NULL 포인터를 처리하므로 lstrlen을 strlen 또는 strnlen으로 바꿀 때 명시적 NULL 검사 필요합니다(코드의 해당 지점에서 NULL 포인터가 가능한 경우).

이 오류 및 권장 대체(신뢰할 수 있는 데이터와 신뢰할 수 없는 데이터 모두에 대한)가 적용되는 모든 금지 함수 목록은 다음 예제 다음에 찾을 수 있습니다.

코드 분석 이름: BANNED_API_USAGE_LSTRLEN

예제

다음 코드는 이 경고를 생성합니다.

int example_func(char* in)
{ 
    int size = lstrlen(in);
    return size; 
} 

이는 안전하지 않은 함수 lstrlen을 사용하기 때문입니다. 이 문제를 해결하려면 strlen을 대체 항목으로 사용하여 포인터가 NULL인지 검사 수 있습니다.

int example_func(char* in) 
{ 
    if (in != NULL) {
        int size = strlen(in);
        return size;
    }
    else {
        // handle error.
    }
} 

금지된 함수

금지된 API 신뢰할 수 있는 데이터 대체 신뢰할 수 없는 데이터 대체
lstrlen _tcslen _tcsnlen, StringCchLength
lstrlenA strlen strnlen, StringCchLengthA
lstrlenW wcslen wcsnlen, StringCchLengthW