2009-03-31 4 views
5

Ho lavorato con la maggior parte VB.Net per oltre un anno e appena notato questoVB errore di codice non raggiungibile/avviso

faccio folle, o fa VB.Net NON avere un "codice irraggiungibile" avvertimento?

Quanto segue compila tranquillamente con un avviso o un errore, anche se c'è un ritorno tra le due chiamate in scrittura.

Sub Main() 
    Console.WriteLine("Hello World") 
    Return 
    Console.WriteLine("Unreachable code, will never run") 
End Sub 

Mi manca qualcosa? C'è un modo per accendere ciò che non riesco a trovare.

In caso contrario, c'è una buona ragione per la sua omissione? (o ho ragione nel pensare che questo sia uno stato di cose doloroso)

Perdona l'aria di sfogo su questa domanda, non è uno sproloquio, vorrei una risposta.

Grazie


ho sollevato questo su MS Connect, come bug # 428529

Aggiornamento

ho ricevuto la seguente dal Program Manager VB Squadre

Grazie per aver dedicato del tempo per segnalare questo problema. Il compilatore ha un supporto limitato a per questo scenario e, come si fa notare , non abbiamo avvisi per il codice irraggiungibile . Ci sono alcuni scenari che il nostro algoritmo di analisi dei flussi di consente di gestire, come ad esempio il seguenti:

Sub Main() 
    Dim x As Integer 
    Return 
    x = 4 
End Sub 

In questo caso si otterrà un avviso che x non è mai stato assegnato. Per il caso che hai citato, tuttavia, avremo da implementare per una versione futura di .

+2

(fiamma) si sta utilizzando VB in modo che il compilatore ti sta prendendo in giro (/ fiamma) mi dispiace. –

+0

Ian, se potessi votare per un commento :) –

risposta

4

La mia ipotesi è che sia una svista nel compilatore. Il controllo del flusso è un problema molto difficile da correggere in qualsiasi lingua, ma soprattutto in un linguaggio come VB che ha così tanti diversi meccanismi di controllo del flusso. Per esempio,

  • eccezioni
  • Goto
  • On Error (Riprendi, Goto, ecc ...)
  • Exit chiama

Se si sente fortemente su questo problema, si prega di presenta un bug su Connect.Prendiamo molto sul serio gli errori archiviati tramite Connect e facciamo del nostro meglio per risolverne il maggior numero possibile.

+0

So cosa stai dicendo, ma. . . C# ha goto, consente ritorni nel mezzo delle funzioni, ha provato/finalmente blocca. . . E può ancora individuare il codice irraggiungibile. Ho aperto un bug, grazie per il link –

+0

@Binary, l'uso del flusso di controllo da parte di VB è comunque ** molto ** meno restrittivo di C#. Gran parte di esso è trattenuto da VB6 giorni, ma questi artefatti rendono molto più difficile fare un'adeguata analisi del flusso di codice. Puoi postare il numero del bug di connessione qui per favore? – JaredPar

+0

Jared, chiunque usi ancora Goto, su errore ecc merita quello che ottiene. Gestiamo tutto con Option Strict On e ci aspettiamo "more" :) Il numero di bug è 428529. Grazie amico –

0

AFAIK, sei corretto che VB.NET non ti avvisa. C# però.

1

mi piacerebbe affrontare la risposta di Jared.

La maggior parte dei problemi che presenta non sono problematici per l'analisi del flusso di dati.

L'unica eccezione è "On Error/Resume". Hanno incasinato l'analisi del flusso di dati piuttosto male.

Tuttavia, si tratta di un problema piuttosto semplice per mitigare:

Se più di un "On Error" istruzione viene utilizzata in un metodo, o il "Resume Next" istruzione viene utilizzata, si può semplicemente disattivare il flusso di dati analisi e segnalare un avvertimento generico. Uno buono potrebbe essere qualcosa come "In caso di errore/ripresa sono deprecati, utilizzare invece le eccezioni". :)

Nel caso comune di una sola istruzione "On Error" e nessuna istruzione "resume", è possibile eseguire praticamente l'analisi del flusso di dati normale e ottenere risultati ragionevoli da esso.

Il grosso problema riguarda il modo in cui viene implementato il codice DFA esistente. Non usa un grafico del flusso di controllo, e quindi cambiarlo finisce per essere molto costoso. Penso che se vuoi affrontare questo tipo di problemi, devi davvero rimuovere il codice DFA esistente e sostituirlo con qualcosa che utilizza un grafico del flusso di controllo.