2010-03-06 4 views
3

Ceci est le message d'avertissement C4055.Comment pouvons-nous résoudre C4055 Avertissement?

« conversion »: de pointeur de données « type1 » pour fonctionner pointeur « type2 »
Un pointeur de données est coulé (éventuellement à tort) à un pointeur de fonction.
Ceci est un avertissement de niveau 1 sous/Za et un avertissement de niveau 4 sous/Ze.

Comment résoudre cet avertissement (titre correct, pas un truc)

Edit:

Ceci est un extrait de code a avertissement.

typedef NTSTATUS (*t_ObRegisterCallbacks) 
(
    IN POB_CALLBACK_REGISTRATION CallBackRegistration, 
    OUT PVOID *RegistrationHandle 
); 

t_ObRegisterCallbacks g_ObRegisterCallbacks = NULL; 

void foo() 
{ 
    g_ObRegisterCallbacks = (t_ObRegisterCallbacks)MmGetSystemRoutineAddress(&regName); //C4055 
} 
//warning C4055: 'type cast' : from data pointer 'PVOID' to function pointer 't_ObRegisterCallbacks' 
+1

Pour votre information, 'MmGetSystemRoutineAddress()' a des problèmes sur XP SP2: http://www.osronline.com/article.cfm ? article = 494 – bk1e

Répondre

10

Les fichiers d'en-tête WDK ne sont pas si propres. Le type de retour pour MmGetSystemRoutineAddress() aurait dû être déclaré FARPROC au lieu de PVOID. Pourtant, cela n'a pas d'importance sur une machine pour laquelle vous écrivez des pilotes de périphérique avec le WDK, un void * est convertible en une adresse de fonction sans problèmes, les données et les pointeurs de code ont la même taille sur les plates-formes 32 et 64 bits . Ce sera une journée froide en enfer quand nous aurons à nouveau ce problème de mémoire segmentée.

Je vous recommande de tourner simplement le message d'avertissement avec avertissement #pragma (désactiver: 4055)

+0

Merci pour votre réponse claire. – Benjamin

7

La fusion entre les pointeurs de données et de fonctions n'est pas autorisée. Vous pouvez utiliser le hack de l'union pour la conversion de type: type d'union contenant les deux pointeurs, puis écrire comme un type et lire comme un autre. Inutile de dire que ceci est non transférable en ce qui concerne la norme, mais cela rend les compilateurs heureux et fonctionne assez souvent dans la pratique. Les fonctions qui retournent des pointeurs de données en tant que pointeurs de données (dlsym étant une fonction populaire du genre) sont cassées par conception et vous ne pouvez contourner cela que par des astuces telles que le hack de l'union.

Questions connexes