Annotazioni a virgola mobile per i driver

Le annotazioni a virgola mobile consentono allo strumento di analisi del codice di rilevare l'uso di virgola mobile nel codice in modalità kernel e possono segnalare errori se lo stato a virgola mobile non è protetto correttamente. Le regole a virgola mobile vengono controllate solo per il codice in modalità kernel.

Per alcune famiglie di processori, in particolare processori x86, l'uso di operazioni a virgola mobile dall'interno del codice in modalità kernel deve essere eseguito solo nell'ambito delle funzioni che salvano e ripristinano lo stato a virgola mobile. Le violazioni di questa regola possono essere particolarmente difficili da trovare perché causeranno solo sporadicamente problemi in fase di esecuzione (ma questi problemi possono essere molto gravi). Con l'uso corretto delle annotazioni, gli strumenti di analisi del codice sono efficaci per rilevare l'uso di virgola mobile nel codice in modalità kernel e segnalare un errore se lo stato a virgola mobile non è protetto correttamente. Le regole a virgola mobile vengono controllate solo per il codice in modalità kernel.

Aggiungere le annotazioni seguenti ai parametri di funzione per indicare le operazioni eseguite con lo stato a virgola mobile.

Annotazione a virgola mobile Descrizione
_Kernel_float_saved_ La funzione con annotazioni salva lo stato hardware a virgola mobile, quando la funzione viene restituita correttamente.
_Kernel_float_restored_ La funzione con annotazioni ripristina lo stato hardware a virgola mobile quando la funzione viene restituita correttamente.
_Kernel_float_used_ Se la funzione viene chiamata in modo sicuro da una funzione chiamante, è possibile usare l'annotazione _Kernel_float_used_ per eliminare la segnalazione di errori. Tuttavia, se la funzione chiamante non viene annotata anche con _Kernel_float_used_ o la chiamata di funzione non si verifica tra le funzioni annotate rispettivamente con _Kernel_float_saved_ e _Kernel_float_restored_, gli strumenti di analisi del codice segnalano un errore.

Queste annotazioni sono già applicate allo stato KeSaveFloatingPoint e alle funzioni di sistema KeRestoreFloatingPointState, oltre alle annotazioni per l'acquisizione e il rilascio di risorse per evitare perdite. Anche le funzioni EngXxx simili vengono annotate in questo modo. Tuttavia, anche le funzioni che esezionare queste funzioni devono usare queste annotazioni.

Se la funzione nel suo complesso viene chiamata in modo sicuro da una funzione chiamante, la funzione può essere annotata con _Kernel_float_used_ annotazione. In questo modo viene eliminato l'avviso e vengono inoltre generati gli strumenti di analisi del codice per verificare che il chiamante usi la funzione in modo sicuro. È possibile aggiungere livelli aggiuntivi di _Kernel_float_used_ in base alle esigenze. L'annotazione _Kernel_float_used_ viene fornita automaticamente dagli strumenti di analisi del codice quando il risultato della funzione o uno dei parametri della funzione è un tipo a virgola mobile, ma non fa male fornire l'annotazione in modo esplicito.

Ad esempio, l'annotazione _Kernel_float_saved_ indica che lo stato a virgola mobile viene archiviato nel parametro FloatingState della funzione di sistema KeSaveFloatingPointState.

_Must_inspect_result_  
_IRQL_requires_max_(DISPATCH_LEVEL)  
__drv_valueIs(<0;==0)  
_When_(return==0, _Kernel_float_saved_)  
_At_(*FloatingState, _Kernel_requires_resource_not_held_(FloatState) _When_(return==0, _Kernel_acquires_resource_(FloatState)))  
__forceinline  
NTSTATUS  
KeSaveFloatingPointState (  
    _Out_ PVOID FloatingState  
    )  

Nell'esempio seguente l'annotazione _Kernel_float_used_ elimina gli avvisi sull'uso dello stato a virgola mobile. L'annotazione fa anche in modo che gli strumenti di analisi del codice verifichino che tutte le chiamate a MyDoesFloatingPoint si verifichino in un contesto a virgola mobile sicura.

_Kernel_float_used_
void
    MyDoesFloatingPoint(arguments);

Annotazioni SAL 2.0 per i driver Windows