8

Sto lavorando su un modulo di calcolo utilizzando C#, e mi sono imbattuto in questo:Come essere avvisati su potenziali errori aritmetici dovuti alla conversione del tipo?

double v = 4/100; 

So che questo è un inizializzazione di sbagliato che restituisce v = 0.0 invece di v = 0.04

Le regole C# dice che devo garantire di almeno uno dei membri è un doppio, in questo modo:

double v = (double) 4/100; 
double v = 4.0/100; 

Tuttavia, ho molti molti inizializzazioni di questo tipo che coinvolge le operazioni sulle variabili intere e mi sento pigro a sfogliare il codice riga per riga per rilevare tali errori.

Invece, è possibile essere avvisati dal compilatore su questo?

+0

Dipende dal compilatore che si sta utilizzando. I messaggi di errore e gli avvertimenti non sono una funzione incorporata del linguaggio, ma qualcosa che il compilatore aggiunge. Se il compilatore che stai utilizzando non lo supporta, allora no, non è possibile. – Hoeloe

+1

C'è un [biglietto dell'uservoice] (http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2813345-add-a-warning-when-promoting-the-result-of-integer) che chiede per questa caratteristica. –

+0

Sto usando il compilatore C# fornito con .NET 4.0 e Visual Studio 2010. – Larry

risposta

4

Bene, dopo un po 'suonare in giro e cosa no, ho una soluzione. Ho usato this article per venire a questa soluzione. Io uso StyleCop, quindi dovrai installarlo e installarlo. Quindi, puoi scaricare il mio progetto C# MathematicsAnalyzer.

Prima di tutto, non ho tenuto conto di tutti i disallineamenti di conversione del tipo. In effetti, accolgo solo una parte.

Fondamentalmente, controllo se la riga contiene "double" seguito da uno spazio. So che questo potrebbe portare a falsi allarmi, perché la fine di una classe potrebbe essere doppia o un numero qualsiasi di altre cose, ma la lascerò a voi per capire come isolare correttamente il tipo.

Se viene trovata una corrispondenza, controllo per vedere che corrisponde a questa espressione regolare:

double[ ][A-Za-z0-9]*[ ]?=(([ ]?[0-9]*d[ ]?/[ ]?[0-9]*;)|[ ]?[0-9]*[ ]?/[ ]?[0-9]*d;) 

Se lo fa -non- corrispondere a questo regex, poi aggiungo una violazione. Ciò che corrisponde a questa espressione regolare è uno dei seguenti:

  • double i = 4d/100;
  • doppio i = 4d/100;
  • doppio i = 4/100d;
  • doppio i = 4/100d;
  • doppio i = 4/100d;
  • doppio i = 4/100d;
  • doppio i = 4d/100;
  • doppio i = 4/100d;
  • doppio i = 4/100d;

Qualsiasi dei precedenti non creerà una violazione. Come è scritto al momento, praticamente se non viene usata una "d", verrà lanciata una violazione. È necessario aggiungere una logica aggiuntiva per tenere conto degli altri possibili modi di trasmettere esplicitamente un operando. Mentre sto scrivendo questo, mi sono appena reso conto che avere una "d" su entrambi gli operandi genererebbe molto probabilmente un'eccezione. Ops.

Infine, non sono riuscito a far sì che StyleCop visualizzasse correttamente la mia violazione. Continuava a darmi un errore riguardo alla regola non esistente, e anche con un secondo paio di occhi su di esso, non siamo riusciti a trovare una soluzione, quindi l'ho hackerato. L'errore mostra il nome della regola che stavi cercando, quindi ho inserito il nome della regola come qualcosa di descrittivo e incluso il numero della riga.

Per installare la regola personalizzata, creare il progetto MathematicalAnalyzer. Chiudi Visual Studio e copia la DLL nella directory di installazione di StyleCop. Quando apri Visual Studio, dovresti vedere la regola nelle impostazioni di StyleCop. I passaggi 5 e 6 dell'articolo che ho usato mostra dove farlo.

Questo ottiene solo una violazione alla volta per tutta la soluzione, quindi dovrai correggere la violazione che mostra, ed eseguire nuovamente StyleCop per trovare quello successivo. Potrebbe esserci un modo per aggirare questo, ma ho finito il succo e mi sono fermato qui.

Divertiti!

+0

Grazie mille. Non è perfetto, ma aiuta molto. – Larry

3

In questo articolo viene spiegato come impostare le regole di analisi del codice personalizzate che, quando si esegue l'analisi del codice, è possibile visualizzare gli avvisi e quali no.

http://blog.tatham.oddie.com.au/2010/01/06/custom-code-analysis-rules-in-vs2010-and-how-to-make-them-run-in-fxcop-and-vs2008-too/

+0

Grazie mille per queste informazioni. Sfortunatamente, non sarà facile implementare una regola personalizzata che analizzi il mio codice per tale mancata corrispondenza di conversione di tipo. – Larry

+0

Capisco completamente. Ci ho pensato, ma è l'unico modo che ho potuto trovare nella mia ricerca. – seekerOfKnowledge