[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

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01