Précédent   Forum du club des développeurs et IT Pro > Dotnet > Général Dotnet > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, faq, sources pour .NET
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 28/01/2006, 21h37   #1
smyley
Expert Confirmé Sénior
 
Avatar de smyley
 
Inscription : juin 2003
Messages : 6 270
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 6 270
Points : 7 029
Points : 7 029
Envoyer un message via MSN à smyley
Par défaut [Outils][C# - #ZipLib] Dépassements de capacité arithmétique



En utilisant la classe BZip2 de la #ZipLib, j'ai rencontré un pb que je n'avais jamais connu
Ma config : WinXP + DotNet 1.1 + VS.Net 2003

En voulant compresser n'importe quoi avec BZip2OutputStream avec les paramètres par défaut, j'obtient une érreur :
Citation:
Exception non gérée : System.OverflowException: L'opération arithmétique a provoqué un dépassement de capacité.
at ICSharpCode.SharpZipLib.Checksums.StrangeCRC.Update(Int32 inCh) in c:\lksoft\applications\ms.net\izdb\sharpziplib\checksums\strangecrc.cs:line 141
at ICSharpCode.SharpZipLib.BZip2.BZip2OutputStream.WriteRun() in c:\lksoft\applications\ms.net\izdb\sharpziplib\bzip2\bzip2outputstream.cs:line 437
at ICSharpCode.SharpZipLib.BZip2.BZip2OutputStream.WriteByte(Byte bv) in c:\lksoft\applications\ms.net\izdb\sharpziplib\bzip2\bzip2outputstream.cs:line 422
at ICSharpCode.SharpZipLib.BZip2.BZip2OutputStream.Write(Byte[] buf, Int32 off, Int32 len) in c:\lksoft\applications\ms.net\izdb\sharpziplib\bzip2\bzip2outputstream.cs:line 137
...
Cette érreur correspond toujours à ce block de code :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
		public void Update(int inCh)
		{
			int temp = (globalCrc >> 24) ^ inCh;
			if (temp < 0) 
			{
				temp = 256 + temp;
			}
                        //Erreur à la ligne suivante
			globalCrc = (int)((globalCrc << 8) ^ crc32Table[temp]);
		}
Pourquoi ai-je cette érreur ?
note. J'ai testé avec les fichiers StrangeCRC.cs, BZip2*.cs des version 0.50,0.60,0.80,0.84, de plus jusqu'à hier mon assembly fonctionnait nikel
smyley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2006, 11h30   #2
NicolasG
Membre expérimenté
 
Inscription : juillet 2002
Messages : 487
Détails du profil
Informations personnelles :
Âge : 44
Localisation : France, Maine et Loire (Pays de la Loire)

Informations forums :
Inscription : juillet 2002
Messages : 487
Points : 599
Points : 599
La première chose à faire est de décomposer la ligne en question pour voir quelle opération cause une erreur :

Code :
1
2
3
        int val1 = globalCrc << 8;
        int val2 = crc32Table[temp];
       globalCrc = val1 ^ val2;
globalCrc est bien un Int32 ?
__________________
On ne peut pas faire boire un âne qui n'a pas soif.
NicolasG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2006, 14h20   #3
smyley
Expert Confirmé Sénior
 
Avatar de smyley
 
Inscription : juin 2003
Messages : 6 270
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 6 270
Points : 7 029
Points : 7 029
Envoyer un message via MSN à smyley
Citation:
Envoyé par NicolasG
globalCrc est bien un Int32 ?
Oui.

Je vient d'éssayer un truc, dans les options de Visual j'ai désactivé ( False )
Vérifier les dépacements de capacité arithmétiques positifs et négatifs et ça remarche nikel , et donc avant, vu que je compilait avec SharpDevelop cette option semble ne pas être définie

Mais alors pourquoi vérifier ou non les dépacements de capacité ?
smyley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2006, 16h21   #4
NicolasG
Membre expérimenté
 
Inscription : juillet 2002
Messages : 487
Détails du profil
Informations personnelles :
Âge : 44
Localisation : France, Maine et Loire (Pays de la Loire)

Informations forums :
Inscription : juillet 2002
Messages : 487
Points : 599
Points : 599
Citation:
Envoyé par documentation C# Opérateur <<
Les opérations de décalage ne causent jamais de dépassement de capacité.
: : :
__________________
On ne peut pas faire boire un âne qui n'a pas soif.
NicolasG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2006, 17h13   #5
smyley
Expert Confirmé Sénior
 
Avatar de smyley
 
Inscription : juin 2003
Messages : 6 270
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 6 270
Points : 7 029
Points : 7 029
Envoyer un message via MSN à smyley
J'ai réalisé un test ( désolé, le code est long )
Propriété "Vérifier..." définie à "True"
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
 
		readonly static uint[] crc32Table = 
		{
			0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
			0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
			0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
			0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
			0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
			0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
			0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
			0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
			0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
			0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
			0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
			0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
			0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
			0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
			0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
			0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
			0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
			0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
			0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
			0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
			0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
			0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
			0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
			0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
			0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
			0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
			0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
			0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
			0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
			0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
			0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
			0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
			0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
			0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
			0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
			0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
			0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
			0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
			0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
			0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
			0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
			0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
			0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
			0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
			0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
			0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
			0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
			0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
			0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
			0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
			0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
			0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
			0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
			0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
			0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
			0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
			0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
			0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
			0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
			0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
			0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
			0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
			0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
			0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
		};
 
		private void button1_Click(object sender, System.EventArgs e)
		{
			System.Random rd = new Random();
			byte[] buf = new byte[500];
			rd.NextBytes(buf);
			int cr = -1;
			int l;
			int tmp;
			for(int i = 0;i<500;i++)
			{
				l = (cr >> 24) ^ buf[i];
				if(l < 0)
					l = 256 + l;
 
				tmp = l << 8;
				cr = (int)(tmp ^ crc32Table[l]);
			}
		}
Erreur sur la ligne :
Code :
1
2
 
cr = (int)(tmp ^ crc32Table[l]);
smyley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2006, 17h38   #6
NicolasG
Membre expérimenté
 
Inscription : juillet 2002
Messages : 487
Détails du profil
Informations personnelles :
Âge : 44
Localisation : France, Maine et Loire (Pays de la Loire)

Informations forums :
Inscription : juillet 2002
Messages : 487
Points : 599
Points : 599
Ok mais tu ne donnes toujours pas l'instruction précise qui génère l'erreur.
Le pb vient du cast, du xor ...?
Voir ma première question.
__________________
On ne peut pas faire boire un âne qui n'a pas soif.
NicolasG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2006, 17h49   #7
smyley
Expert Confirmé Sénior
 
Avatar de smyley
 
Inscription : juin 2003
Messages : 6 270
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 6 270
Points : 7 029
Points : 7 029
Envoyer un message via MSN à smyley
dsl j'avais oublié de décomposer cette ligne
Code :
1
2
3
4
5
6
 
long longtmp;
...
tmp = l << 8;
longtmp = tmp ^ crc32Table[l];
cr = (int)longtmp;
Erreur sur le cast

En fait, si je garde que la valeur "long" sans faire un cast vers int, il n'y a aucune érreur ( et j'ai bien mon CRC ) mais alors pourquoi dans la #zipLib font-il le cast ????
smyley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2006, 17h59   #8
NicolasG
Membre expérimenté
 
Inscription : juillet 2002
Messages : 487
Détails du profil
Informations personnelles :
Âge : 44
Localisation : France, Maine et Loire (Pays de la Loire)

Informations forums :
Inscription : juillet 2002
Messages : 487
Points : 599
Points : 599
Voilà le problème: crc32Table[l] est un UInt donc un cast en Int ne peut se faire sans perte.
Il me paraît préférable d'utiliser des UInt d'un bout à l'autre pour être plus cohérent. Voir s'il n'y a pas d'effets de bord ...
__________________
On ne peut pas faire boire un âne qui n'a pas soif.
NicolasG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2006, 18h37   #9
doccpu
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
+100 pour NicolasG
  Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2006, 20h01   #10
smyley
Expert Confirmé Sénior
 
Avatar de smyley
 
Inscription : juin 2003
Messages : 6 270
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 6 270
Points : 7 029
Points : 7 029
Envoyer un message via MSN à smyley
ça marche avec des uint,
je m'en vais de ce pas corriger le fichier StrangeCRC.cs de la #ziplib que j'utilise
smyley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2012, 15h03   #11
Bazteam_dga
 
Inscription : juillet 2009
Messages : 3
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 3
Points : -1
Points : -1
Sinon la solution est dans C#

Regarde le mot clé unchecked moi je l'ai fait et plus de soucis.
Bazteam_dga est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 17/04/2012, 16h51   #12
DonQuiche
Expert Confirmé
 
Avatar de DonQuiche
 
Inscription : septembre 2010
Messages : 1 366
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 366
Points : 2 589
Points : 2 589
C'est sûr : si vous désactivez les vérifications arithmétiques aucune exception ne vous sera renvoyée à la tronche. Mais ça ne voudra pas dire pour autant que le résultat sera correct ! Cela peut très bien traduire une erreur qui va corrompre le fichier.

Deux solutions :
* Examiner soigneusement le code source de la biblio pour comprendre pourquoi il y a dépassement de capacité et si c'est un comportement normal ou non. Puis en déduire si c'est un bug de la biblio (et soumettre un patch) ou une erreur dans la façon dont elle est utilisée (et corriger).
* Contacter l'auteur en espérant qu'il accepte de se pencher sur le problème.

EDIT: Cette histoire m'a fait penser à ce billet de Raymond Chen. N'y voyez rien d'agressif, simplement les deux situations sont parfaitement analogues et Raymond Chen a un certain talent pour raconter ce genre d'histoire.
- Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?
- Apparently everyone.
DonQuiche est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h37.


 
 
 
 
Partenaires

Hébergement Web