Warnung C26485

Ausdruck 'Arrayname': Kein Array zum Zeigerzerfall (Bounds.3).

Hinweise

Wie C26481 hilft diese Prüfung, die C++-KernrichtlinienregelI.13 zu erzwingen: Übergeben Sie kein Array als einzelner Zeiger. Die Regel erkennt Orte, an denen statische Arraytypinformationen vom Verfall in einen unformatierten Zeiger verloren gehen. Die zstring Typen czstring sind nicht ausgeschlossen.

C26481 und C26485 stammen aus den Bounds Tresor ty Profile rules. Diese Regeln wurden in der ersten Version der C++ Core Guidelines Checker implementiert. Sie gelten für die Kategorie "Unformatierte Zeiger", da sie dazu beitragen, unsichere Verwendung von Unformatierten Zeigern zu vermeiden.

Beispiel

Dieses Beispiel führt zu zwei Warnungen für array to pointer decay im Aufruf von memcpy.

// c26485_bad.cpp
// compile using:
// set Esp.Extensions=CppCoreCheck.dll
// cl /W4 /EHsc /permissive- /analyze /analyze:plugin EspXEngine.dll /analyze:ruleset "%VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets\CppCoreCheckBoundsRules.ruleset" c26485_bad.cpp
#include <cstring>
constexpr int array_length = 10;

int main() noexcept
{
    int const from_array[array_length] = { 4, 3, 2, 1, 0, 9, 8, 7, 6, 5 };
    int to_array[array_length] = {};

    if (nullptr != memcpy(to_array, from_array, sizeof(int) * array_length))
        return 0;
    return 1;
}

Um dieses Problem zu beheben, vermeiden Sie Aufrufe, die Zeigerparameter annehmen, aber keine Begrenzungsinformationen verwalten. Die Verwendung solcher Funktionen ist häufig fehleranfällig. Bevorzugen Sie C++-Standardbibliotheksaufrufe für C-Laufzeitbibliotheksfunktionen. Erwägen Sie die Verwendung gsl::span oder std::vector in Ihren eigenen Funktionen. Eine explizite Umwandlung in den verfallenen Zeigertyp verhindert die Warnung, verhindert jedoch nicht den Code des Fehlers.