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 |
---|---|
avviso C28101: Il modulo Drivers ha dedotto che la funzione corrente non è il tipo corretto di funzione |
|
avviso C28110: i driver devono proteggere lo stato hardware a virgola mobile. Vedere l'uso di float |
|
avviso C28111: IRQL in cui è stato salvato lo stato a virgola mobile non corrisponde all'IRQL corrente (per questa operazione di ripristino). |
|
avviso: C28114: la copia di un'intera voce dello stack IRP lascia determinati campi inizializzati che devono essere cancellati o aggiornati. |
|
avviso C28120: la funzione non può essere chiamata a livello di runtime di integrazione corrente. Il livello corrente è troppo basso. |
|
avviso C28121: la funzione non può essere chiamata a livello di runtime di integrazione corrente. Il livello corrente è troppo elevato. |
|
avviso C28122: la funzione non può essere chiamata a un livello irQ basso. Le chiamate di funzione precedenti non sono coerenti con questo vincolo. |
|
avviso C28123: la funzione non può essere chiamata a un livello irQ elevato. Le chiamate di funzione precedenti non sono coerenti con questo vincolo. |
|
avviso C28124: la chiamata a fa sì che il livello IRQ venga impostato al di sotto del minimo accettabile per la funzione analizzata. |
|
avviso C28126: Il parametro AccessMode per ObReferenceObject* deve essere IRP-RequestorMode> |
|
avviso C28127: la funzione utilizzata come routine non corrisponde esattamente al tipo previsto. |
|
avviso C28128: è stato effettuato direttamente un accesso a un campo. Deve essere fatto da una routine. |
|
avviso C28129: è stata effettuata un'assegnazione a un operando, che deve essere modificata solo usando set di bit e cancella |
|
avviso C28131: la routine DriverEntry deve salvare una copia dell'argomento, non il puntatore, perché Gestione I/O libera il buffer |
|
avviso C28132: Acquisizione delle dimensioni del puntatore |
|
avviso C28133: IoInitializeTimer viene chiamato meglio da AddDevice |
|
avviso C28134: il tipo di un tag del pool deve essere integrale, non un puntatore stringa o stringa |
|
avviso C28135: se il primo argomento di KeWaitForSingleObject è una variabile locale, il parametro Mode deve essere KernelMode |
|
avviso C28139: l'argomento deve corrispondere esattamente al tipo |
|
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 |
|
avviso C28143: anche una routine dispatch che chiama IoMarkIrpPending deve restituire STATUS_PENDING |
|
avviso C28144: all'interno di una routine di annullamento, al punto di uscita, irQL in Irp-CancelIrql> deve essere l'IRQL corrente. |
|
avviso C28145: La struttura MDL opaca non deve essere modificata da un driver |
|
avviso C28146: i driver in modalità kernel devono usare ntstrsafe.h, non strsafe.h. Trovato nel file di origine |
|
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 |
|
avviso C28150: la funzione determina l'impostazione del livello IRQ al di sopra del valore massimo accettabile per la funzione analizzata |
|
avviso C28151: il valore non è un valore legale per un IRQL |
|
avviso C28152: restituito da una funzione simile a AddDevice in modo imprevisto DO_DEVICE_INITIALIZING |
|
avviso C28153: non è stato possibile valutare il valore di un runtime di integrazione dall'annotazione in questo contesto. |
|
avviso C28156: irQL effettivo non è coerente con il runtime di integrazione richiesto |
|
avviso C28157: IRQL non è mai stato ripristinato |
|
avviso C28158: Nessun IRQL salvato |
|
avviso C28161: uscita senza acquisire il diritto di usare hardware mobile |
|
avviso C28162: Uscita tenendo premuto il diritto per l'uso dell'hardware a virgola mobile |
|
avviso C28165: il puntatore a funzione della classe non corrisponde alla classe della funzione |
|
avviso C28166: la funzione non ripristina il runtime di integrazione al valore corrente nella voce della funzione ed è necessario farlo. |
|
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. |
|
avviso C28168: la funzione dispatch non dispone di un'annotazione Dispatch_type corrispondente a questa voce della tabella dispatch |
|
avviso C28169: la funzione dispatch non include alcuna annotazione Dispatch_type |
|
avviso C28170: la funzione è stata dichiarata in un segmento di paging, ma non è stato trovato né PAGED_CODE né PAGED_CODE_LOCKED |
|
avviso C28171: la funzione ha più di un'istanza di PAGED_CODE o PAGED_CODE_LOCKED |
|
avviso C28172: la funzione ha PAGED_CODE o PAGED_CODE_LOCKED ma non è dichiarata in un segmento di paging |
|
avviso C28173: la funzione corrente sembra adattarsi erroneamente alla memoria fisica superiore a 4 GB |
|
avviso C28175: il membro dello struct non deve essere accessibile da un driver |
|
avviso C28176: il membro dello struct non deve essere modificato da un driver |
|
avviso C28177: la funzione viene annotata con più classi di funzioni. Tutti, ma uno verrà ignorato. |
|
avviso C28260: è stato rilevato un errore di sintassi nelle annotazioni durante l'analisi di una proprietà all'interno di una funzione |
|
È stato rilevato un errore di sintassi nelle annotazioni per la proprietà nella funzione . |
|
avviso C28268: la classe di funzione nella funzione non corrisponde alla classe di funzione nel typedef usato qui |
|
avviso C28601: Evitare il blocco in HWND_BROADCAST |
|
avviso C28602: evitare di chiamare SendMessageTimeout con HWND_BROADCAST |
|
avviso C28604: evitare di chiamare SendMessageTimeout con SMTO_ABORTIFHUNG con un timeout pari a 0 |
|
avviso C28615: deve chiamare _resetstkoflw nel blocco __except() quando si chiama _alloca nel blocco __try. Non chiamare _resetstkoflw dall'interno di un blocco catch() |
|
avviso C28616: condizione AV multithreading |
|
avviso C28617: evitare di usare il valore restituito di _beginthread(). Usare invece _beginthreadex() |
|
avviso C28623: cast senza segno delle coordinate GetMessagePos(). Usare GET_X_LPARAM/GET_Y_LPARAM anziché LOWORD/HIWORD |
|
avviso C28624: Nessuna chiamata a Release() per trovare la corrispondenza con refcount incrementato da LResultFromObject |
|
avviso C28625: la chiamata di funzione usata per cancellare i dati sensibili verrà ottimizzata |
|
avviso C28636: Chiamata di LocalFree su un puntatore non allocato ottenuto dalle chiamate a GetSecurityDescriptorOwner/Group/Dacl/Sacl |
|
avviso C28637: Chiamare la funzione in un inizializzatore globale non è sicuro |
|
avviso C28638: lo stub di delayload della funzione manca una dichiarazione corrispondente |
|
avviso C28639: Chiamata dell'handle di chiusura con stringa |
|
avviso C28640: lo stub delayload della funzione deve essere una funzione statica |
|
avviso C28644: valore restituito da DPA_InsertPtr non selezionato |
|
avviso C28645: MessageBox è stato chiamato usando il simbolo del messaggio del punto interrogativo che non è più consigliato |
|
avviso C28648: PulseEvent è una funzione inaffidabile |
|
avviso C28649: le matrici di stack automatico o globale non sono mai NULL |
|
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. |
|
avviso C28651: l'inizializzatore statico causa la copia nelle pagine di scrittura a causa di puntatori a funzioni membro |
|
avviso C28652: l'inizializzatore statico causa la copia nelle pagine di scrittura a causa di operatori bit per bit di overload |
|
avviso C28714: Cast tra tipi integer semanticamente diversi |
|
avviso C28715: Cast tra tipi integer semanticamente diversi |
|
avviso C28716: cast inserito dal compilatore tra tipi integrali diversi semanticamente |
|
avviso C28717: tipo VARIANT non valido |
|
avviso C28718: buffer non annotato |
|
avviso C28719: Utilizzo api escluse |
|
avviso C28720: Utilizzo api escluse |
|
avviso C28721: Architettura del contatore delle prestazioni deprecata |
|
avviso C28722: Buffer non annotato nella dichiarazione di funzione |
|
avviso C28723: buffer non annotato nella definizione della funzione senza dichiarazione corrispondente |
|
avviso C28725: Usare Watson invece di questo SetUnhandledExceptionFilter |
|
avviso C28726: Utilizzo api escluse |
|
avviso C28727: Utilizzo api escluse |
|
avviso C28728: Utilizzo api escluse |
|
avviso C28730: possibile assegnazione di '\0' direttamente a un puntatore. |
|
avviso C28735: Utilizzo API Crimson vietato |
|
avviso C28736: Utilizzo di argomenti API escluse |
|
avviso C28740: buffer senza segno non firmato |
|
avviso C28741: buffer non annotato nella funzione |
|
avviso C28742: buffer non annotato nella funzione |
|
avviso C28750: Uso vietato di lstrlen e delle relative varianti |
|
avviso C28751: Uso vietato di ExAllocatePool e delle relative varianti |
|
avviso C28752: uso vietato dell'API kernel32 o advapi32 |
|
avviso C28753: Basarsi su un ordine non definito di valutazione dei parametri |
|
avviso C30029: Chiamata di una funzione di allocazione di memoria che richiede memoria eseguibile |
|
avviso C30030: Chiamata di una funzione di allocazione della memoria e passaggio di un parametro che indica la memoria eseguibile |
|
avviso C30031: Chiamata di una funzione di allocazione della memoria e passaggio di un parametro che indica la memoria eseguibile |
|
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 |
|
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. |
|
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. |
|
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. |