È un bug evidente, oltre ogni dubbio.
L'intento dell'avviso NON è di avvisare di tutte le divisioni in un programma. Sarebbe troppo rumoroso in qualsiasi programma ragionevole. Invece, l'intento è di avvisarti quando devi controllare un argomento. In questo caso, hai controllato l'argomento. Quindi, il compilatore dovrebbe averlo notato e stare zitto.
L'implementazione tecnica di tale funzione viene effettuata etichettando le variabili nei rami del codice con determinati attributi. Uno degli attributi più comuni è il tri-stato "Is null". Prima del ramo, arg
è una variabile esterna e arg [[Isnull]]
è sconosciuto. Ma dopo il controllo su arg
ci sono due rami. Nel primo ramo arg [[Isnull]]
è vero. Nel secondo ramo arg [[Isnull]]
è falso.
Ora, quando si tratta di generare avvisi di puntatore nullo e zero, è necessario verificare l'attributo [[IsNull]
. Se è vero, hai un grave avvertimento/errore. Se sconosciuto, dovresti generare l'avviso sopra indicato - un potenziale problema, oltre a quello che può dimostrare il compilatore. Ma in questo caso, l'attributo [[isNull]]
è False. Il compilatore con la stessa logica formale degli umani, sa che non c'è alcun rischio.
Ma come facciamo a sapere che il compilatore utilizza internamente un attributo di tipo [[Isnull]]
? Ricorda il primo paragrafo: senza di esso, dovrebbe o avvisare sempre o mai. Sappiamo che a volte avvisa, ergo ci deve essere un attributo [[IsNull]]
.
Fare attenzione, confrontando argomenti "doppi" sull'uguaglianza. La magia del male succede lì ... – SadSido
No, non è così. Processo perfettamente definito. In particolare, '0.0 == -0.0'. Quindi, per tutti gli insiemi di valori per i quali '1./arg' è definito, sappiamo che' arg! = 0.0'. – MSalters
@MSalters: ma a causa di errori di arrotondamento, arg potrebbe non essere 0.0 (o -0.0 per quella materia) quando ci si aspettava che lo fosse. – jalf