Freigeben über


Warnung C28750

Verbotene Verwendung von lstrlen und seinen Varianten: "*function-name" ist eine gesperrte API für verbesserte Fehlerbehandlungszwecke.

Diese Warnung gibt an, dass eine Funktion verwendet wird, die gesperrt wurde und einen robusteren oder sichereren Ersatz aufweist. Dieser spezifische Fehler weist auf die Verwendung von lstrlen oder einer Variante davon hin.

Hinweise

Die lstrlen-Funktion und ihre Varianten sind gesperrt, da sie keine Ausnahmen übertragen können. Dies kann dazu führen, dass Fehlerbedingungen viel später auftreten, möglicherweise in einem anderen Thread. Dies erschwert die Diagnose der Fehlerbedingungen. Darüber hinaus können äquivalente Ersatzfunktionen vom Compiler optimiert werden, um den Leistungsaufwand von Ausnahmehandlern (__try und __except-Blöcken) zu vermeiden.

Die richtige Entschärfung besteht darin, eine sicherere Zeichenfolgenlängenfunktion zu verwenden (in der Regel strlen, wcslen, _tcslen). Während Sie die lstrlen-Änderungen überprüfen, sollten Sie jedoch bestätigen, dass der Zeichenfolgenpuffer aus vertrauenswürdigem Code stammt. Wenn Sie mit nicht vertrauenswürdigen Daten zu tun haben, sollten Sie stattdessen von der Strlen-Familie von Funktionen zur Strnlen-Familie (oder StringCchLength-Familie) wechseln, um sicherzustellen, dass sie die Grenzen des nicht vertrauenswürdigen Datenblocks nicht überschritten.

Beachten Sie, dass im Gegensatz zu lstrlen keine der Ersetzungen Ausnahmen abfangen. Außerdem behandelt lstrlen NULL-Zeiger, während die Ersetzungen nicht, sodass eine explizite NULL-Überprüfung erforderlich ist, wenn lstrlen durch strlen oder strnlen ersetzt wird (wenn NULL-Zeiger an dieser Stelle im Code möglich sind).

Eine Liste aller gesperrten Funktionen, die von diesem Fehler betroffen sind, und empfohlener Ersetzungen (sowohl für vertrauenswürdige als auch für nicht vertrauenswürdige Daten) finden Sie nach dem folgenden Beispiel.

Name der Codeanalyse: BANNED_API_USAGE_LSTRLEN

Beispiel

Der folgende Code generiert diese Warnung:

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

Dies ist auf die Verwendung der unsicheren Funktion lstrlen zurückzuführen. Um dieses Problem zu beheben, können wir strlen als Ersatz verwenden und überprüfen, ob der Zeiger NULL ist:

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

Gesperrte Funktionen

Gesperrte API Vertrauenswürdige Datenersetzung(en) Nicht vertrauenswürdige Datenersetzung(en)
lstrlen _tcslen _tcsnlen, StringCchLength
lstrlenA strlen strnlen, StringCchLengthA
lstrlenW wcslen wcsnlen, StringCchLengthW