Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Multiplication, comparaison et débordement

15 réponses
Avatar
Lucas Levrel
Bonjour,

Je dois comparer le produit de plusieurs int à une constante (dans une
macro). Typiquement :

#define LIMITE 512*1024*1024
int a,b,c;
...
if(a*b*c<LIMITE) ...

Comment faire ça proprement si LIMITE et le produit sont supérieurs à
INT_MAX ? Notamment :
- quel type pour LIMITE ;
- comment écririez-vous la comparaison ?

Le but étant la lisibilité et la portabilité, pas la performance.

Pour LIMITE je suppose qu'il faut opter pour long long int, parce qu'avec
unsigned int je vais buter sur 4 gigas. Mais je pourrais aussi utiliser
un flottant s'il est plus portable (une petite erreur d'arrondi n'est pas
grave dans mon contexte).

Merci.
--
LL

5 réponses

1 2
Avatar
Antoine Leca
JKB écrivit :
Si déjà les développeurs pouvaient être conforme à Posix quelque
chose ou SysV, plutôt que d'être conforme Linux ou FreeBSD sur x86, ce
serait vraiment bien. Certains jours, je rêve de ça...



Mon impression pour regarder cela de plus près ces temps-ci (après un
assez long moment plus éloigné du sujet), c'est que ce n'est VRAIMENT
pas la direction suivie.

Sans compter que pour un système qui serait un peu à la traîne,
Posix:2008 (au sens strict, pas X/Open) représente un effort vraiment
important par rapport à :2001/:2004, du fait du nombre important
d'interface qui sont passées de optionnelles à obligatoires.

En fait, je me demande à quoi cela sert de toujours avoir la distinction
entre les deux, il semblerait qu'aujourd'hui un vendeur se doive de
viser X/Open (actuellement) 7, quitte à officiellement couvrir Posix au
cas où quelques commandes historiques viendraient de BSD plutôt que de
SysV...


Antoine
Avatar
JKB
Le Wed, 22 Sep 2010 19:52:57 +0200,
Antoine Leca écrivait :
JKB écrivit :
Si déjà les développeurs pouvaient être conforme à Posix quelque
chose ou SysV, plutôt que d'être conforme Linux ou FreeBSD sur x86, ce
serait vraiment bien. Certains jours, je rêve de ça...



Mon impression pour regarder cela de plus près ces temps-ci (après un
assez long moment plus éloigné du sujet), c'est que ce n'est VRAIMENT
pas la direction suivie.



Nous sommes bien d'accord. Et je passe sur les conneries avec la
mémoire qui ne fonctionnent que sur x86. Des histoires d'alignement
mémoire qui plantent partout ailleurs ! Il y en a encore un dans
seamonkey. Quant à OpenOffice, je n'en parle même pas...

Sans compter que pour un système qui serait un peu à la traîne,
Posix:2008 (au sens strict, pas X/Open) représente un effort vraiment
important par rapport à :2001/:2004, du fait du nombre important
d'interface qui sont passées de optionnelles à obligatoires.

En fait, je me demande à quoi cela sert de toujours avoir la distinction
entre les deux, il semblerait qu'aujourd'hui un vendeur se doive de
viser X/Open (actuellement) 7, quitte à officiellement couvrir Posix au
cas où quelques commandes historiques viendraient de BSD plutôt que de
SysV...



JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
espie
In article ,
JKB wrote:
Encore que NetBSD, FreeBSD et Linux sont beaucoup plus conformes que
OpenBSD, surtout lorsqu'on parle de conformité Posix 2001. Et il y a
des systèmes prétendûment Posix (comme MacOS X ou Solaris) qui ne le
sont pas plus qu'un Linux brut de fonderie.



A cote de ca, il y a des points sur lesquels OpenBSD te donnera de meilleurs
diagnostics... t'as pas idee du nombre de buffer overflow et underflow qu'on
a vu passer un peu partout depuis qu'on a un malloc qui vise systematiquement
a ce que les zones en bordure fassent des segfault...
Avatar
JKB
Le Wed, 22 Sep 2010 22:22:57 +0000 (UTC),
Marc Espie écrivait :
In article ,
JKB wrote:
Encore que NetBSD, FreeBSD et Linux sont beaucoup plus conformes que
OpenBSD, surtout lorsqu'on parle de conformité Posix 2001. Et il y a
des systèmes prétendûment Posix (comme MacOS X ou Solaris) qui ne le
sont pas plus qu'un Linux brut de fonderie.



A cote de ca, il y a des points sur lesquels OpenBSD te donnera de meilleurs
diagnostics... t'as pas idee du nombre de buffer overflow et underflow qu'on
a vu passer un peu partout depuis qu'on a un malloc qui vise systematiquement
a ce que les zones en bordure fassent des segfault...



Peut-être. Maintenant, s'il faut pour avoir ce genre de
fonctionnement avoir un OS qui se tire une balle dans le pied dès
qu'on mélange la libpthread avec des trucs comme les piles
alternatives, je préfère encore coder sur du Linux en me
restreignant à POSIX ou SysV et en vérifiant avec des outils comme
valgrind.

Je n'ai pas regardé comment fonctionne cette chose, mais s'il
fonctionne de la même façon que efence, c'est inutilisable sur la
plupart des programmes sérieux.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
espie
In article ,
JKB wrote:
Je n'ai pas regardé comment fonctionne cette chose, mais s'il
fonctionne de la même façon que efence, c'est inutilisable sur la
plupart des programmes sérieux.



C'est inutile sur les programmes serieux, qui par definition, sont codes
correctement. ;-) par contre, sur les programmes reels codes avec les pieds,
ca marche bien. Par exemple, on a du corriger deux/trois bugs qui empechaient
de compiler openoffice (eh oui, buffer underflow en pagaille dans dmake).

Tout betement, c'est actif par defaut, et c'est juste malloc qui a tendance
a te faire des trous dans l'espace memoire vu par un processus, et a placer
pas mal d'allocations memoire en bordure de trou. Si tu en veux un peu plus,
il y a des options pour ca (malloc regarde une variable d'environnement a
l'initialisation), qui vont bouffer un peu plus de place/un peu de CPU.

Il y a eu un enorme boulot de fait pour que ca bouffe peu de ressources.
En particulier, ca serait pas actif par defaut si ca avait un reel impact.
1 2