Compartilhar via


Aviso C28750

Uso proibido de lstrlen e suas variantes: '*function-name' é uma API proibida para fins aprimorados de tratamento de erros.

Esse aviso indica que uma função está sendo usada que foi banida e tem uma substituição mais robusta ou segura. Esse erro específico indica o uso de lstrlen ou uma variante dela.

Comentários

A função lstrlen e suas variantes são proibidas porque não transmitem exceções. Isso pode fazer com que as condições de erro ocorram muito mais tarde, potencialmente em um thread diferente. Isso torna as condições de erro mais difíceis de diagnosticar. Além disso, as funções substitutas equivalentes podem ser otimizadas pelo compilador e evitar a sobrecarga de desempenho de manipuladores de exceção (blocos de __try e __except).

A mitigação correta é usar uma função de comprimento de cadeia de caracteres mais segura (geralmente strlen, wcslen _tcslen). No entanto, ao examinar as alterações lstrlen, você deve confirmar que o buffer de cadeia de caracteres é proveniente de código confiável. Se você estiver lidando com dados não confiáveis, deverá alternar da família strlen de funções para a família strnlen (ou a família StringCchLength), o que garantirá que eles não ultrapassem os limites do bloco de dados não confiável.

Observe que, ao contrário de lstrlen, nenhuma das substituições captura exceções. Além disso, lstrlen manipula ponteiros NULL enquanto as substituições não, portanto, um marcar NULL explícito é necessário ao substituir lstrlen por strlen ou strnlen (se ponteiros NULL forem possíveis nesse ponto no código).

Uma lista de todas as funções proibidas cobertas por esse erro e substituições recomendadas (para dados confiáveis e não confiáveis) pode ser encontrada após o exemplo a seguir.

Nome da análise de código: BANNED_API_USAGE_LSTRLEN

Exemplo

O seguinte código gera esse aviso:

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

Isso ocorre devido ao uso da função não segura lstrlen. Para corrigir esse problema, podemos usar o strlen como a substituição, certificando-se de marcar se o ponteiro for NULL:

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

Funções proibidas

API proibida Substituição de dados confiáveis Substituição de dados não confiáveis
lstrlen _tcslen _tcsnlen, StringCchLength
lstrlenA strlen strnlen, StringCchLengthA
lstrlenW wcslen wcsnlen, StringCchLengthW