Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Expert Confirmé Sénior
    Avatar de smyley
    Inscrit en
    juin 2003
    Messages
    6 270
    Détails du profil
    Informations forums :
    Inscription : juin 2003
    Messages : 6 270
    Points : 7 130
    Points
    7 130

    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 :
    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

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : juillet 2002
    Messages : 487
    Points : 599
    Points
    599

    Par défaut

    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.

  3. #3
    Expert Confirmé Sénior
    Avatar de smyley
    Inscrit en
    juin 2003
    Messages
    6 270
    Détails du profil
    Informations forums :
    Inscription : juin 2003
    Messages : 6 270
    Points : 7 130
    Points
    7 130

    Par défaut

    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é ?

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : juillet 2002
    Messages : 487
    Points : 599
    Points
    599

    Par défaut

    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.

  5. #5
    Expert Confirmé Sénior
    Avatar de smyley
    Inscrit en
    juin 2003
    Messages
    6 270
    Détails du profil
    Informations forums :
    Inscription : juin 2003
    Messages : 6 270
    Points : 7 130
    Points
    7 130

    Par défaut

    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]);

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : juillet 2002
    Messages : 487
    Points : 599
    Points
    599

    Par défaut

    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.

  7. #7
    Expert Confirmé Sénior
    Avatar de smyley
    Inscrit en
    juin 2003
    Messages
    6 270
    Détails du profil
    Informations forums :
    Inscription : juin 2003
    Messages : 6 270
    Points : 7 130
    Points
    7 130

    Par défaut

    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 ????

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : juillet 2002
    Messages : 487
    Points : 599
    Points
    599

    Par défaut

    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.

  9. #9
    doccpu
    Invité(e)

    Par défaut

    +100 pour NicolasG

  10. #10
    Expert Confirmé Sénior
    Avatar de smyley
    Inscrit en
    juin 2003
    Messages
    6 270
    Détails du profil
    Informations forums :
    Inscription : juin 2003
    Messages : 6 270
    Points : 7 130
    Points
    7 130

    Par défaut

    ça marche avec des uint,
    je m'en vais de ce pas corriger le fichier StrangeCRC.cs de la #ziplib que j'utilise

  11. #11

    Inscrit en
    juillet 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 3
    Points : -1
    Points
    -1

    Par défaut

    Sinon la solution est dans C#

    Regarde le mot clé unchecked moi je l'ai fait et plus de soucis.

  12. #12
    Expert Confirmé Avatar de DonQuiche
    Inscrit en
    septembre 2010
    Messages
    1 932
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 1 932
    Points : 3 689
    Points
    3 689

    Par défaut

    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.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •