Domanda

Ho un progetto in cui ho appena scoperto che avviso C4244 (possibile perdita di dati) è stato soppresso. Ho il forte sospetto che alcuni di intestazione MS scadente sta sopprimendo questo avviso e lasciando soppresso per tutte le unità di traduzione che includono detto colpo di testa, ma non ho determinato quale dei loro miriade di intestazioni potrebbero essere in difetto.

Quindi, come ogni altro problema di programmazione, vorrei iniziare facendo una ricerca binaria, stampando il livello di allarme in corso e, se possibile, eventuali avvisi soppressi nel mio principale Pre Intestazione compilato.

Qualcuno sa che cosa direttiva del compilatore posso usare, o quale approccio potrei essere in grado di prendere che mi avrebbe dato questa informazione?

Non posso dirvi come odioso è di trovare che le mie dichiarazioni di tipo attentamente costruiti nei miei intestazioni non riescono a dare un avvertimento del compilatore quando un chiamante viola il contratto e cerca di mandarmi un intero invece di un byte con segno (che ha ha portato al bug corrente che sto cercando di risolvere).

Pensieri?

NOTE:

Ricerche su #pragma tutta la mia soluzione venire con solo le dichiarazioni equilibrate di #pragma warning (disable: xxxx) seguiti da #pragma warning (di default: xxxx). E nessuno di quelli di riferimento 4244.

Ricerche su 4244 in tutta l'intera soluzione restituiscono nessun risultato (non ho mai ignorare tale avvertimento, né nessuno dei miei librerie incluse, sotto-progetti, ecc.).

Ricerche su 4244 in tutta la MS comprendono percorsi di ritorno un paio di riferimenti, che apparire per essere in pareggio, o quasi, a seconda dei simboli #define che sono stati fissati prima di chiamarli. Di qui il mio sospetto che la SM è la colpa (combinata con precedente storia di MS fare il lavoro scrupoloso nelle intestazioni).

È stato utile?

Soluzione 4

Dopo ulteriori indagini:

/ P richiede troppo tempo (non ho mai assistito è sempre al di là di alcuni file nel corso di quasi un'ora, in modo che ho cancellato build)

Non sono mai stato in grado di trovare un modo chiara per stampare ciò che il livello di avviso corrente era, o qualsiasi override che erano in vigore in un determinato punto nella compilation. Quindi la domanda che ho chiesto non è realmente risposto, a meno che l'argomento / P è in realtà utile a voi (come ho già detto, è stato poco pratico per i miei scopi).

Quello che ho potuto fare è stato di costruire alcune chiamate in linea nelle varie intestazioni che dovrebbe generare il requisito di avviso se il livello di allarme incluso che avverte come attiva, per verificare se questo avvertimento era attiva o meno:

inline int prova (valore char) {return ++ valore; }

includere "qualcosa"

inline int test1 (int value) {test di ritorno (valore); } // dovrebbe generare C4244 -. Possibile perdita di dati se il # include precedente non rovinare il livello di avviso o di sostituzione di avvertimento 4244

E così via ...

Alla fine, quello che ho scoperto è che 4244, in particolare, ha alcune regole strane ad esso associati, e che è effettivamente "disabile" in tutto solo / W4 (livello di allarme 4) - il più alto livello di allarme. Dal momento che il livello di allarme è molto, molto permaloso e si lamenta di un sacco di cose che sono ben oltre la nostra portata di fare nulla di loro, non volevo per abilitare / W4.

Quello che ho fatto, invece è stato quello di mettere le seguenti nel nostro PCH stdafx.h:

pragma warning (errore: 4244) // questo consente pienamente avvertenze per l'eventuale perdita di dati a causa di conversione di tipo implicita in ogni circostanza, indipendentemente dal livello di allarme attivo

che ha funzionato.

Quindi, MS non ha lasciato le sostituzioni di avvertimento sbilanciati in nessuno dei loro file che ci hanno colpito. E 'stato proprio questo 4244 è molto indulgente, tranne al più alto livello di allarme, in cui diventa davvero utile per noi, in ogni caso.

Grazie per il vostro aiuto!

Altri suggerimenti

Un'altra opzione è quella di aggiungere questo

#pragma warning (defualt) 

nella parte superiore del file subito dopo i #includes Questo ripristina l'avvertimento al defualt, scartando qualsiasi ignorare che avrebbe potuto essere chiamato.

In una nota diversa, lo trovo altamente improbabile che un header Microsoft avrebbe disabilitare un avvertimento.

Si può solo fare una ricerca attraverso tutti i file di intestazione per "C4244" o avete solo l'accesso al pre-compilato file header?

scroll top