C28170

avviso C28170: la funzione è stata dichiarata come in un segmento di pagina, ma non PAGED_CODE né PAGED_CODE_LOCKED trovato

Lo strumento Analisi del codice segnala questo errore quando #pragma alloc_text o #pragma code_seg viene usato per spostare una funzione che non contiene una macro PAGED_CODE o PAGED_CODE_LOCKED in una sezione codice paginabile. Questo errore viene segnalato al numero di riga corrispondente alla prima parentesi graffe ({) nella funzione.

Lo strumento Analisi codice inferisce che una sezione è paginabile quando il nome della sezione inizia con PAGE. Le funzioni nel codice paginabile devono contenere una macro PAGED_CODE o PAGED_CODE_LOCKED all'inizio della funzione tra la prima parentesi graffe ({ ) e la prima istruzione condizionale.

Queste macro consentono allo strumento analisi del codice e a un controllo runtime di determinare se il codice paginabile potrebbe essere eseguito in un IRQL con privilegi elevati. Se si verifica un errore di pagina durante l'esecuzione del sistema a un livello elevato, il sistema si arresterà in modo anomalo.

Se le funzioni in un segmento a pagina vengono successivamente bloccate in memoria, usare PAGED_CODE_LOCKED anziché PAGED_CODE. La macro PAGE_CODE_LOCKED consente al driver di effettuare chiamate che generano IRQL senza riscontrare un avviso PREfast per i driver.

Questa condizione è spesso molto difficile da trovare durante il test (a meno che la macro PAGED_CODE venga usata per causare la verifica dell'errore del driver), perché il codice deve effettivamente essere impaginato per l'errore della pagina.

Esempio

Nell'esempio di codice seguente viene generato questo avviso.

void func();
#pragma alloc_text("PAGED_CODE", func);

void func1()
{
   // paged, no PAGED_CODE: error
}

Nell'esempio di codice seguente viene evitato questo avviso.

void func();
#pragma alloc_text("PAGED_CODE", func);

void func2()
{
   PAGED_CODE(); // includes PAGED_CODE macro
}