[C#] checked/unchecked contre OverflowException

Comme le savent les programmeurs .net, le code managé permet de coder assurément, et les buffer overflow et autres integer overflow sont du passé. Hors les overflows de nombre ne sont uniquement gérés lors de la compilation..

Exemple :

int entier = 2147483647 *2;

-> Ce code n'est pas compilable ! En effet la valeur ne rentre pas dans l'entier de 32 bits signé.


Maintenant, si nous compilons ce code:

int maxValue = int.MaxValue; // ou int maxValue = 2147483647;
int entier = maxValue * 2;

->ce code se compile ET s'execute (pour retourner -2). Qui l'eu cru !

En effet, vous auriez pu croire (comme moi) que l'exception OverflowException aurait été levé, il n'en ai rien !
Pour vous protéger donc des interger Overflow et autres cochonneries, utilisez un context checked.

checked  //contexte n'acceptant pas les overflows.
{
int entier = unchecked(2147483647 *2); // aucun problème à l'execution / compilation
int maxValue = int.MaxValue;
int entier = maxValue * 2// throw OverflowException durant l'execution

}


Pour résumer, méfiez-vous ! le code par défaut est en context unchecked ! Vous pouvez modifier ce code dans les options de compilation /checked .A bon entendeur !

Bon codage. Merci à coq au passage pour sa remarque ;)

 

 

Publié dimanche 5 février 2006 18:59 par Poppyto
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: [C#] unchecked : l'ennemi d'OverflowException @ dimanche 5 février 2006 21:31

j'ai quand même une petite question... :
à quoi ça peut bien servir de créer exprès un overflow ?
(n'étant pas un grand spécialiste du C++ ...lol)

Nurgle

# re: [C#] unchecked : l'ennemi d'OverflowException @ dimanche 5 février 2006 21:44

L'overflow non géré permet de repartir à zéro, il y a des utilisations certaines. Je n'ai aps d'exemple flagrant mais j'en ai utilisé dans quelques codes qui ne peuvent être décrits hors contexte ;).

Poppyto

# re: [C#] unchecked : l'ennemi d'OverflowException @ dimanche 5 février 2006 22:03

"-> Si ce calcul arrivait avec des variables, une exception OverflowException serait déclenchée."
Euh non, nous aussi on a le droit de jouer sans unchecked, non mais ;-)

int maxValue = int.MaxValue; // ou int maxValue = 2147483647;
int entier = maxValue * 2;

coq

# re: [C#] unchecked : l'ennemi d'OverflowException @ dimanche 5 février 2006 22:07

Pinaise ! tu as raison coq ! Moi qui pensait que le contexte checked était activé par défaut ! quel beau trou de sécurité...je vais de ce pas réécrire mon post ^^

Poppyto

# re: [C#] unchecked : l'ennemi d'OverflowException @ dimanche 5 février 2006 22:16

En dehors de blocs checked/unchecked, le mode dans lequel on se trouve dépend de la spécification ou non de l'option /checked à la compilation. :-)

coq

# re: [C#] checked/unchecked contre d'OverflowException @ dimanche 5 février 2006 22:21

J'étais juste entrain de le constater !! Je rajoute ça au post.

Poppyto

# re: [C#] checked/unchecked contre OverflowException @ lundi 6 février 2006 09:01

dans le même genre : une petite boucle infinie

byte[] bytes = new bytes[256];
for (byte i=0; i<=255; i++) {
bytes[i] = (byte)(255 - i);
}

sebmafate

# re: [C#] checked/unchecked contre OverflowException @ lundi 6 février 2006 09:08

Elle est connue cette boucle ! On ne se fait pas avoir 2 fois généralement ;)

Poppyto

# re: [C#] checked/unchecked contre OverflowException @ lundi 6 février 2006 11:22

Il faut d'ailleur faire attention si l'on passe d'un code VB a c# c'est que par défaut, compile en mode checked (à l'opposé du c#!). Ce que l'on peut voir avec ce bout de code:

Dim maxValue As Integer
maxValue = Integer.MaxValue

Dim entier As Integer
entier = maxValue * 2

Il genere bien: A first chance exception of type 'System.OverflowException' occurred in ConsoleApplication1.exe

Miiitch

# re: [C#] checked/unchecked contre OverflowException @ lundi 6 février 2006 12:02

Si vous voulez le contexte /checked activé par défaut pour les projets C#, il vous suffit d'ajouter

CheckForOverflowUnderflow = "true"

aux noeuds "Config" dans les fichiers csproj des templates des projets en questions, dans

<VSDIR>\VC#\VC#Wizards

coq


Les 10 derniers blogs postés

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le 02-09-2012, 11:01

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le 02-09-2012, 08:28

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59

- Perspective 3.0 pour Silverlight 5.0 par Perspective le 02-07-2012, 22:39