O programinha acima não causa quaisquer exceções... de fato, os itens do array a cujo índice seja menor que 1 e maior que 8 são "lixo" e são devolvidos por a.
Para evitar esse tipo de bug devemos usar a chave de compilação $R nos códigos:
Erros semelhantes para ponto-flutuante devem também ser levados em consideração... Não apenas a exceção EZeroDivide, mas tb as exceções EUnderflow e EOverflow. Isso levanta outra questão: O problema da instrução FDIV nos antigos processadores Pentium... Use sempre a chave $U+ para prevenir esse bug.
Pergunta
Renyo
Galera, recebi um email dum programador das antigas aqui na empresa...
e achei interessante e gostaria de passar pra você's...!!!
Dêem uma lida, vale a pena mesmo !!!
Valeu ! :rolleyes:
Senhores... um "bug" BRABO do Delphi que detectei:
Esses bugs foram detectados quando analisava uma rotina que TINHA QUE DAR PAU... mas não dava!
Os exemplos abaixo ilustram:
--------------------------------------------------------------------------------
const a: array [1..8] of Integer = ( 1, 2, 3, 4, 5, 6, 7, 8 );
var i: Integer;
begin
for i := -10 to 10 do
WriteLn(a);
end.
--------------------------------------------------------------------------------
O programinha acima não causa quaisquer exceções... de fato, os itens do array a cujo índice seja menor que 1 e maior que 8 são "lixo" e são devolvidos por a.
Para evitar esse tipo de bug devemos usar a chave de compilação $R nos códigos:
--------------------------------------------------------------------------------
// Usando $R+ garantimos que uma exceção ERangeError seja disparada neste caso.
{$R+}
const a: array [1..8] of Integer = ( 1, 2, 3, 4, 5, 6, 7, 8 );
var i: Integer;
begin
for i := -10 to 10 do
WriteLn(a);
end.
--------------------------------------------------------------------------------
O mesmo ocorre, por exemplo, se usarmos um tipo sem sinal e tentarmos fazer isso:
--------------------------------------------------------------------------------
var x: Cardinal;
begin
x := 0;
Dec(x);
WriteLn(x);
end.
--------------------------------------------------------------------------------
O compilador não chia.... mas o valor mostrado será 4294967295, e não -1 como poderia ser esperado!
Para evitar esse erro, use a chave $Q:
--------------------------------------------------------------------------------
// Usando $Q+ garantimos que uma exceção EIntOverflow seja disparada neste caso.
{$Q+}
var x: Cardinal;
begin
x := 0;
Dec(x);
WriteLn(x);
end.
--------------------------------------------------------------------------------
Erros semelhantes para ponto-flutuante devem também ser levados em consideração... Não apenas a exceção EZeroDivide, mas tb as exceções EUnderflow e EOverflow. Isso levanta outra questão: O problema da instrução FDIV nos antigos processadores Pentium... Use sempre a chave $U+ para prevenir esse bug.
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.