Avviso C26485
Espressione 'array-name': nessuna matrice per il decadimento del puntatore (bounds.3).
Osservazioni:
Come C26481, questo controllo consente di applicare la regola delle linee guida di base di C++I.13: non passare una matrice come singolo puntatore. La regola rileva le posizioni in cui le informazioni sul tipo di matrice statica vengono perse dal decadimento a un puntatore non elaborato. I zstring
tipi e czstring
non sono esclusi.
C26481 e C26485 provengono dalle regole del profilo di sicurezza Bounds. Queste regole sono state implementate nella prima versione di C++ Core Guidelines Checker. Sono applicabili alla categoria di puntatori non elaborati perché consentono di evitare l'uso non sicuro di puntatori non elaborati.
Esempio
Questo esempio genera due avvisi per il decadimento del puntatore della matrice nella chiamata a 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;
}
Per risolvere questo problema, evitare chiamate che accettano parametri puntatore, ma non gestiscono le informazioni sui limiti. L'uso di tali funzioni è spesso soggetto a errori. Preferisce le chiamate della libreria standard C++ alle funzioni della libreria di runtime C. È consigliabile usare gsl::span
o std::vector
nelle proprie funzioni. Un cast esplicito al tipo di puntatore decadito impedisce l'avviso, ma non impedisce il codice buggy.