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