Ir para conteúdo
  • Cadastre-se

dev botao

Problema com a função UpdateCrc32 - Range check error


Intelliware
Ver Solução Respondido por Daniel Simoes,
  • Este tópico foi criado há 1515 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro

Boa tarde pessoal, 

    Estou recebendo o erro de Range check error, ao executar o método:

ACBrNFe1.DistribuicaoDFePorChaveNFe(0,'65212607000180', '31171110705501000470550010003151641421771140');

    Retornando a seguinte mensagem:

Não foi possivel importar o XML, tente novamente em alguns segundos!
WebService Distribuição de DFe:
- Inativo ou Inoperante tente novamente.
Range check error

    Efetuando o debug da função, cheguei que o problema ocorre na função:

function UpdateCrc32 (function crc32(thecrc: cardinal; S: TStream; len: Cardinal): Cardinal;

    Que está implementada na unit GZIPUtils na linha 395 que contêm o comando:

Result := UpdateCrc32(b, Result);

    Debugando passo-a-passo para um melhor entendimento teremos:

ACBrNFe            -> function TACBrNFe.DistribuicaoDFePorChaveNFe(AcUFAutor: integer; ACNPJCPF, AchNFe: String): Boolean;
ACBrNFe            -> function TACBrNFe.Distribuicao(AcUFAutor: integer; ACNPJCPF, AultNSU, ANSU,  chNFe: String): Boolean; (Linha 909)
ACBrDFeWebService  -> function TDFeWebService.Executar: Boolean; (Linha 187)
ACBrNFeWebServices -> function TNFeEnvEvento.TratarResposta: Boolean; (Linha 2989)
pcnRetDistDFeInt   -> function TRetEventoNFe.LerXml: Boolean; (Linha 435)
ACBrCompress       -> function DeCompress(const ABinaryString: AnsiString): AnsiString; (Linha 141)
ACBrCompress       -> function DeCompress(AStream: TStream): AnsiString; (Linha 154)
ACBrCompress       -> function DeCompress(inStream, outStream: TStream): Boolean; (Linha 169)
GZIPUtils          -> function unzipStream(inStream, outStream: TStream): boolean; (Linha 271) 
GZIPUtils          -> function crc32(thecrc: cardinal; S: TStream; len: Cardinal): Cardinal; (Linha 395) => Erro na função UpdateCrc32(b, Result);

    Retornando:

Valor de "b"      = 60
Valor de "Result" = 4294967295
Msg de erro:      "Range check error"

    Efetuei o teste com outras chaves,  utilizando outros CNPJ, mas o erro persiste.

    Atualizei o source da ACBr pelo SVN hoje, mas o problema persiste.

    Gostaria da opinião de vocês sobre este assunto. Houve alguma alteração de propriedade ou atualização de DLL que impactaria neste erro?

    Desde já agradeço a opinião de vocês.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Estranho que é uma implementação que não foi alterada.

O componente ACBrNFe teria algum timeout que teríamos que setar para este caso?

Nos clientes funciona normal. Estamos fazendo uma bateria de testes no sistema e fomos validar esta função e recebemos o erro acima em todos os computadores que testamos.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Fizemos um teste aqui, da seguinte maneira, acrescentamos na unit ACBRNFeWebServices, na function TDistribuicaoDFe.TratarResposta, comando para salvar em arquivo a variável FPRetWS antes de executar FretDistDFeInt.LerXml, foi retornado o arquivo em anexo(teste2.xml).

A princípio o arquivo está completo.

teste2.xml

Link para o comentário
Compartilhar em outros sites

  • Moderadores
2 minutos atrás, Intelliware disse:

Delphi XE2 Update 4

Estranho. poderia informar um passo a passo com o demo do ACBr que está no svn?

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Juliomar, boa tarde.

No demo da ACBr, funciona normal. Com as mesmas configurações, no nosso projeto não está funcionando. Estamos tentando verificar o que pode estar de diferente em ambos os projetos. Já validamos os pacotes instalados e aparentemente está tudo normal. Mas no projeto nosso continua não funcionando. Bem estranho.

Link para o comentário
Compartilhar em outros sites

  • Moderadores
7 minutos atrás, Intelliware disse:

Juliomar, boa tarde.

No demo da ACBr, funciona normal. Com as mesmas configurações, no nosso projeto não está funcionando. Estamos tentando verificar o que pode estar de diferente em ambos os projetos. Já validamos os pacotes instalados e aparentemente está tudo normal. Mas no projeto nosso continua não funcionando. Bem estranho.

Opa agora a noticia foi boa!

então basta ter a mesma situação que irá funcionar. 

Obrigado pelo retorno.

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Bom dia Juliomar,

Ontem, após vários testes e comparações, descobrimos o seguinte:

Se na propriedade do projeto estiver marcada a opção:

Delphi Compiler -> Compiling -> Runtime errors -> Range checking -> True

configuracao-projeto.thumb.jpg.f00eb63aff80668156698efbbde80e6b.jpg

Na unit GZIPUtils.pas, na função:

function crc32(thecrc: cardinal; S: TStream; len: Cardinal): Cardinal;

Na linha 395:

Result := UpdateCrc32(b, Result);

Começamos a receber o erro de Range check error.

Pelo que verificamos em debug, o escopo do Cardinal é de 0..4294967295, enquanto que a função UpdateCrc32 retorna um tipo Integer que pode ser de -2147483648..2147483647. Logo, ao retornar um valor negativo ou um valor além do escopo do tipo da variável, vai ocasionar a exceção descrita.

O demo da ACBr e o outro projeto nosso que não deu erro estava False na propriedade acima. No projeto que apresentava o problema setamos para False, efetuamos um Clean e um Build e voltou a ter o mesmo comportamento dos outros projetos. 

Com isto, resolvemos o problema. Estamos te passando o que concluímos para uma avaliação.

Desde já agradeço.

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
Em 14/11/2017 at 08:23, Intelliware disse:

Bom dia Juliomar,

Ontem, após vários testes e comparações, descobrimos o seguinte:

Se na propriedade do projeto estiver marcada a opção:


Delphi Compiler -> Compiling -> Runtime errors -> Range checking -> True

configuracao-projeto.thumb.jpg.f00eb63aff80668156698efbbde80e6b.jpg

Na unit GZIPUtils.pas, na função:


function crc32(thecrc: cardinal; S: TStream; len: Cardinal): Cardinal;

Na linha 395:


Result := UpdateCrc32(b, Result);

Começamos a receber o erro de Range check error.

Pelo que verificamos em debug, o escopo do Cardinal é de 0..4294967295, enquanto que a função UpdateCrc32 retorna um tipo Integer que pode ser de -2147483648..2147483647. Logo, ao retornar um valor negativo ou um valor além do escopo do tipo da variável, vai ocasionar a exceção descrita.

O demo da ACBr e o outro projeto nosso que não deu erro estava False na propriedade acima. No projeto que apresentava o problema setamos para False, efetuamos um Clean e um Build e voltou a ter o mesmo comportamento dos outros projetos. 

Com isto, resolvemos o problema. Estamos te passando o que concluímos para uma avaliação.

Desde já agradeço.

 

No nosso projeto optamos por modificar a unit do GZIPUtils com o seguinte trecho de código:

 

    {$R-} // disable range checking
      Result := UpdateCrc32(b, Result);
    {$R+} // enable range checking

Pois desabilitar o range checking para nós não é a melhor opção, em virtude de alguns problemas passarem despercebidos.

Fonte: https://stackoverflow.com/questions/4997911/switch-off-delphi-range-checking-for-a-small-portion-of-code-only

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • 2 anos depois...
  • Consultores
Em 07/01/2020 at 17:03, LUCAS CARDOSO DA SILVA disse:

Dessa forma todas as vezes que o ACBR for atualizado tem que refazer esta alteração na unit do gZip?

Acho que você não notou que o tópico é de mais de 2 anos atrás. Não temos ciência dessa situação hoje.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Consultores
2 horas atrás, LUCAS CARDOSO DA SILVA disse:

Notei, porém o problema continua.

Se tiver alguma sugestão de correção, fique a vontade para anexar o arquivo alterado para análise.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Olá Antonio, tem de promover esta alteração

No nosso projeto optamos por modificar a unit do GZIPUtils com o seguinte trecho de código:

 

    {$R-} // disable range checking
      Result := UpdateCrc32(b, Result);
    {$R+} // enable range checking

 

aqui funcionou, porém sempre que atualiza o acbr tem que refezar

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, LUCAS CARDOSO DA SILVA disse:

Olá Antonio, tem de promover esta alteração

No nosso projeto optamos por modificar a unit do GZIPUtils com o seguinte trecho de código:

 

    {$R-} // disable range checking
      Result := UpdateCrc32(b, Result);
    {$R+} // enable range checking

 

aqui funcionou, porém sempre que atualiza o acbr tem que refezar

Crendeuspai.. não tem alternativa... bora lá..

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

O {R-} apenas mascara o Warning / Erro... por favor tentem sobrepor as Units no Zip em Anexo...

 

Fontes.zip

  • Curtir 2
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

Em 29/01/2020 at 10:03, Daniel Simoes disse:

Commit [r18943]

tem uma coisa ainda nessa unit "synautil": que dá um hint: não sei se é descuido de quem fez, ou a primeira atribuição estava ali antes para algo e não mais precisa. O primeiro x é inutil.

No build all que detecta esse hint...

veja a imagem:

image.thumb.png.0c7dc859aca19f83a86ecb319c73854d.png

Editado por Antonio Gomes
asynautil
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1515 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.