Avertissement du compilateur (niveau 3, désactivé) C4191
« opération » : conversion non sécurisée du « type_of_expression » au « type_required »
Effectuer un appel de fonction à l’aide du pointeur résultant peut entraîner l’échec de votre programme
Plusieurs opérations faisant appel à des pointeurs fonction sont considérées comme non sécurisées :
Types de fonction avec conventions d’appel différentes.
Types de fonction avec conventions de retour différentes.
Types d’argument ou de retour de différentes tailles, catégories de types ou classifications.
Longueurs différentes des listes d’arguments (sur
__cdecl
, uniquement sur un cast de la liste la plus longue vers la liste la plus courte, même si la plus courte est déclarée varargs).Pointeur vers des données (autre que
void*
) utilisées comme alias d’un pointeur vers une fonction.Toute autre différence de type pouvant conduire à une erreur ou un avertissement sur un
reinterpret_cast
.
L’appel de cette fonction par le pointeur résultat peut bloquer votre programme.
Cet avertissement est désactivé par défaut. Pour plus d'informations, consultez Compiler Warnings That Are Off by Default.
L’exemple suivant génère l’avertissement C4191.
// C4191.cpp
// compile with: /W3 /clr
#pragma warning(default: 4191)
void __clrcall f1() { }
void __cdecl f2() { }
typedef void (__clrcall * fnptr1)();
typedef void (__cdecl * fnptr2)();
int main() {
fnptr1 fp1 = static_cast<fnptr1>(&f1);
fnptr2 fp2 = (fnptr2) &f2;
fnptr1 fp3 = (fnptr1) &f2; // C4191
fnptr2 fp4 = (fnptr2) &f1; // C4191
};