Condividi tramite


Analisi del codice per gli avvisi dei driver

Questa sezione elenca e descrive gli avvisi segnalati dall'analisi del codice per i driver quando rileva un possibile errore nel codice del driver. Si noti che alcuni avvisi sono destinati al codice in modalità kernel e possono essere ignorati durante l'analisi dei driver in modalità utente.

Importante

L'analisi del codice per i driver è disponibile in Windows 24H2 WDK e EWDK, ma è consigliabile che sia impostata per essere ritirata in una data futura.
In futuro, CodeQL sarà lo strumento di analisi statico principale per i driver. CodeQL offre un linguaggio di query potente che considera il codice come database su cui eseguire query, semplificando la scrittura di query per comportamenti, modelli e altro ancora specifici. Per altre informazioni sull'uso di CodeQL, vedere CodeQL e il test del logo degli strumenti statici.

L'analisi del codice per i driver segnala i tipi di avvisi seguenti:

  • Avvisi generali (6000-6999): potenziali errori nella sintassi C e C++ e nella procedura di codifica generale. Per una descrizione di questi avvisi, vedere Analisi del codice per avvisi C/C++.

  • Avvisi specifici di Windows (28600-28799): questi avvisi sono specifici di determinati modelli di utilizzo in Windows, ma non sono specifici dei driver.

  • Avvisi specifici del driver (28100-28199): errori nell'interazione di un driver con l'applicazione, con altri driver e con il sistema operativo.

  • Errori di annotazione (28200-28299 e 36000-36999): questi avvisi indicano che un'annotazione non è stata codificata correttamente o usata in un contesto non corretto. Nella maggior parte dei casi, la presenza di un avviso di questo tipo indica che l'annotazione non ha l'effetto desiderato (o nessuna).

  • Avvisi di allocazione della memoria (30029-30035): si tratta di avvisi di allocazione della memoria.

In questa sezione

Argomento Descrizione

C28101

avviso C28101: Il modulo Drivers ha dedotto che la funzione corrente non è il tipo corretto di funzione

C28110

avviso C28110: i driver devono proteggere lo stato hardware a virgola mobile. Vedere l'uso di float

C28111

avviso C28111: IRQL in cui è stato salvato lo stato a virgola mobile non corrisponde all'IRQL corrente (per questa operazione di ripristino).

C28114

avviso: C28114: la copia di un'intera voce dello stack IRP lascia determinati campi inizializzati che devono essere cancellati o aggiornati.

C28120

avviso C28120: la funzione non può essere chiamata a livello di runtime di integrazione corrente. Il livello corrente è troppo basso.

C28121

avviso C28121: la funzione non può essere chiamata a livello di runtime di integrazione corrente. Il livello corrente è troppo elevato.

C28122

avviso C28122: la funzione non può essere chiamata a un livello irQ basso. Le chiamate di funzione precedenti non sono coerenti con questo vincolo.

C28123

avviso C28123: la funzione non può essere chiamata a un livello irQ elevato. Le chiamate di funzione precedenti non sono coerenti con questo vincolo.

C28124

avviso C28124: la chiamata a fa sì che il livello IRQ venga impostato al di sotto del minimo accettabile per la funzione analizzata.

C28126

avviso C28126: Il parametro AccessMode per ObReferenceObject* deve essere IRP-RequestorMode>

C28127

avviso C28127: la funzione utilizzata come routine non corrisponde esattamente al tipo previsto.

C28128

avviso C28128: è stato effettuato direttamente un accesso a un campo. Deve essere fatto da una routine.

C28129

avviso C28129: è stata effettuata un'assegnazione a un operando, che deve essere modificata solo usando set di bit e cancella

C28131

avviso C28131: la routine DriverEntry deve salvare una copia dell'argomento, non il puntatore, perché Gestione I/O libera il buffer

C28132

avviso C28132: Acquisizione delle dimensioni del puntatore

C28133

avviso C28133: IoInitializeTimer viene chiamato meglio da AddDevice

C28134

avviso C28134: il tipo di un tag del pool deve essere integrale, non un puntatore stringa o stringa

C28135

avviso C28135: se il primo argomento di KeWaitForSingleObject è una variabile locale, il parametro Mode deve essere KernelMode

C28139

avviso C28139: l'argomento deve corrispondere esattamente al tipo

C28141

avviso C28141: l'argomento fa sì che il livello IRQ venga impostato al di sotto dell'IRQL corrente e questa funzione non può essere usata a tale scopo

C28143

avviso C28143: anche una routine dispatch che chiama IoMarkIrpPending deve restituire STATUS_PENDING

C28144

avviso C28144: all'interno di una routine di annullamento, al punto di uscita, irQL in Irp-CancelIrql> deve essere l'IRQL corrente.

C28145

avviso C28145: La struttura MDL opaca non deve essere modificata da un driver

C28146

avviso C28146: i driver in modalità kernel devono usare ntstrsafe.h, non strsafe.h. Trovato nel file di origine

C28147

avviso C28147: l'uso di un tag del pool predefinito (' kdD' o ' mdW') per le chiamate a questa funzione sconfigge lo scopo dell'assegnazione di tag al pool

C28150

avviso C28150: la funzione determina l'impostazione del livello IRQ al di sopra del valore massimo accettabile per la funzione analizzata

C28151

avviso C28151: il valore non è un valore legale per un IRQL

C28152

avviso C28152: restituito da una funzione simile a AddDevice in modo imprevisto DO_DEVICE_INITIALIZING

C28153

avviso C28153: non è stato possibile valutare il valore di un runtime di integrazione dall'annotazione in questo contesto.

C28156

avviso C28156: irQL effettivo non è coerente con il runtime di integrazione richiesto

C28157

avviso C28157: IRQL non è mai stato ripristinato

C28158

avviso C28158: Nessun IRQL salvato

C28161

avviso C28161: uscita senza acquisire il diritto di usare hardware mobile

C28162

avviso C28162: Uscita tenendo premuto il diritto per l'uso dell'hardware a virgola mobile

C28165

avviso C28165: il puntatore a funzione della classe non corrisponde alla classe della funzione

C28166

avviso C28166: la funzione non ripristina il runtime di integrazione al valore corrente nella voce della funzione ed è necessario farlo.

C28167

avviso C28167: la funzione modifica irQL e non ripristina irQL prima di uscire. Deve essere annotato per riflettere la modifica o il runtime di integrazione deve essere ripristinato.

C28168

avviso C28168: la funzione dispatch non dispone di un'annotazione Dispatch_type corrispondente a questa voce della tabella dispatch

C28169

avviso C28169: la funzione dispatch non include alcuna annotazione Dispatch_type

C28170

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

C28171

avviso C28171: la funzione ha più di un'istanza di PAGED_CODE o PAGED_CODE_LOCKED

C28172

avviso C28172: la funzione ha PAGED_CODE o PAGED_CODE_LOCKED ma non è dichiarata in un segmento di paging

C28173

avviso C28173: la funzione corrente sembra adattarsi erroneamente alla memoria fisica superiore a 4 GB

C28175

avviso C28175: il membro dello struct non deve essere accessibile da un driver

C28176

avviso C28176: il membro dello struct non deve essere modificato da un driver

C28177

avviso C28177: la funzione viene annotata con più classi di funzioni. Tutti, ma uno verrà ignorato.

C28260

avviso C28260: è stato rilevato un errore di sintassi nelle annotazioni durante l'analisi di una proprietà all'interno di una funzione

C28266

È stato rilevato un errore di sintassi nelle annotazioni per la proprietà nella funzione .

C28268

avviso C28268: la classe di funzione nella funzione non corrisponde alla classe di funzione nel typedef usato qui

C28601

avviso C28601: Evitare il blocco in HWND_BROADCAST

C28602

avviso C28602: evitare di chiamare SendMessageTimeout con HWND_BROADCAST

C28604

avviso C28604: evitare di chiamare SendMessageTimeout con SMTO_ABORTIFHUNG con un timeout pari a 0

C28615

avviso C28615: deve chiamare _resetstkoflw nel blocco __except() quando si chiama _alloca nel blocco __try. Non chiamare _resetstkoflw dall'interno di un blocco catch()

C28616

avviso C28616: condizione AV multithreading

C28617

avviso C28617: evitare di usare il valore restituito di _beginthread(). Usare invece _beginthreadex()

C28623

avviso C28623: cast senza segno delle coordinate GetMessagePos(). Usare GET_X_LPARAM/GET_Y_LPARAM anziché LOWORD/HIWORD

C28624

avviso C28624: Nessuna chiamata a Release() per trovare la corrispondenza con refcount incrementato da LResultFromObject

C28625

avviso C28625: la chiamata di funzione usata per cancellare i dati sensibili verrà ottimizzata

C28636

avviso C28636: Chiamata di LocalFree su un puntatore non allocato ottenuto dalle chiamate a GetSecurityDescriptorOwner/Group/Dacl/Sacl

C28637

avviso C28637: Chiamare la funzione in un inizializzatore globale non è sicuro

C28638

avviso C28638: lo stub di delayload della funzione manca una dichiarazione corrispondente

C28639

avviso C28639: Chiamata dell'handle di chiusura con stringa

C28640

avviso C28640: lo stub delayload della funzione deve essere una funzione statica

C28644

avviso C28644: valore restituito da DPA_InsertPtr non selezionato

C28645

avviso C28645: MessageBox è stato chiamato usando il simbolo del messaggio del punto interrogativo che non è più consigliato

C28648

avviso C28648: PulseEvent è una funzione inaffidabile

C28649

avviso C28649: le matrici di stack automatico o globale non sono mai NULL

C28650

avviso C28650: il tipo per il quale viene usato !0 non viene trattato come caso di errore.

Restituzione di un valore di stato, ad esempio ! TRUE non equivale a restituire un valore di stato che indica un errore.

C28651

avviso C28651: l'inizializzatore statico causa la copia nelle pagine di scrittura a causa di puntatori a funzioni membro

C28652

avviso C28652: l'inizializzatore statico causa la copia nelle pagine di scrittura a causa di operatori bit per bit di overload

C28714

avviso C28714: Cast tra tipi integer semanticamente diversi

C28715

avviso C28715: Cast tra tipi integer semanticamente diversi

C28716

avviso C28716: cast inserito dal compilatore tra tipi integrali diversi semanticamente

C28717

avviso C28717: tipo VARIANT non valido

C28718

avviso C28718: buffer non annotato

C28719

avviso C28719: Utilizzo api escluse

C28720

avviso C28720: Utilizzo api escluse

C28721

avviso C28721: Architettura del contatore delle prestazioni deprecata

C28722

avviso C28722: Buffer non annotato nella dichiarazione di funzione

C28723

avviso C28723: buffer non annotato nella definizione della funzione senza dichiarazione corrispondente

C28725

avviso C28725: Usare Watson invece di questo SetUnhandledExceptionFilter

C28726

avviso C28726: Utilizzo api escluse

C28727

avviso C28727: Utilizzo api escluse

C28728

avviso C28728: Utilizzo api escluse

C28730

avviso C28730: possibile assegnazione di '\0' direttamente a un puntatore.

C28735

avviso C28735: Utilizzo API Crimson vietato

C28736

avviso C28736: Utilizzo di argomenti API escluse

C28740

avviso C28740: buffer senza segno non firmato

C28741

avviso C28741: buffer non annotato nella funzione

C28742

avviso C28742: buffer non annotato nella funzione

C28750

avviso C28750: Uso vietato di lstrlen e delle relative varianti

C28751

avviso C28751: Uso vietato di ExAllocatePool e delle relative varianti

C28752

avviso C28752: uso vietato dell'API kernel32 o advapi32

C28753

avviso C28753: Basarsi su un ordine non definito di valutazione dei parametri

C30029

avviso C30029: Chiamata di una funzione di allocazione di memoria che richiede memoria eseguibile

C30030

avviso C30030: Chiamata di una funzione di allocazione della memoria e passaggio di un parametro che indica la memoria eseguibile

C30031

avviso C30031: Chiamata di una funzione di allocazione della memoria e passaggio di un parametro che indica la memoria eseguibile

C30032

avviso C30032: Chiamata di una funzione di allocazione della memoria e forzatura della richiesta di memoria eseguibile tramite l'uso della direttiva POOL_NX_OPTOUT

C30033

avviso C30033: l'allocazione eseguibile è stata rilevata in un driver compilato con POOL_NX_OPTIN. Questo driver è stato determinato a essere caricato in fase di esecuzione da un altro driver. Verificare che il driver di caricamento chiami ExInitializeDriverRuntime(DrvRtPoolNxOptIn) nel driverEntry.

C30034

avviso C30034: passaggio di un valore di flag a una funzione di allocazione che potrebbe comportare l'allocazione della memoria eseguibile. Verificare che la funzione di allocazione non richieda una forma di pool eseguibile non di paging.

C30035

avviso C30035: è stata effettuata una chiamata a una funzione che deve essere eseguita dall'interno della funzione di inizializzazione , ad esempio DriverEntry() o DllInitialize()). PREfast non è riuscito a determinare se la chiamata è stata effettuata dalla funzione di inizializzazione.