Avertissement C26485
Expression 'array-name' : Aucun tableau à la décomposition du pointeur (bounds.3).
Notes
Comme C26481, cette vérification permet d’appliquer la règle C++ Core Guidelines I.13 : Ne passez pas de tableau en tant que pointeur unique. La règle détecte les emplacements où les informations de type de tableau statique sont perdues de la décomposition vers un pointeur brut. Les zstring
types et czstring
les types ne sont pas exclus.
C26481 et C26485 proviennent des règles de profil de sécurité Bounds. Ces règles ont été implémentées dans la première version du vérificateur des instructions de base C++. Elles s’appliquent à la catégorie des pointeurs bruts, car elles permettent d’éviter l’utilisation dangereuse de pointeurs bruts.
Exemple
Cet exemple génère deux avertissements pour la dégradation du tableau vers le pointeur dans l’appel à 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;
}
Pour résoudre ce problème, évitez les appels qui prennent des paramètres de pointeur, mais ne gèrent pas les informations liées. L’utilisation de ces fonctions est souvent sujette aux erreurs. Préférez les appels de bibliothèque standard C++ aux fonctions de bibliothèque runtime C. Envisagez d’utiliser gsl::span
ou std::vector
dans vos propres fonctions. Un cast explicite vers le type de pointeur décomposé empêche l’avertissement, mais il n’empêche pas le code buggy.