Mantis Bug Tracker

View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0001756OCamlOCaml generalpublic2003-07-16 12:112012-01-26 15:18
Reporteradministrator 
Assigned To 
PrioritynormalSeverityminorReproducibilityalways
StatusclosedResolutionfixed 
PlatformOSOS Version
Product Version 
Target VersionFixed in Version3.12.1 
Summary0001756: danger dans compare custom?
DescriptionIl me semble que le code pour le cas Custom_tag dans compare.c est
potentiellement dangereux, car il ne verifie pas que les deux
blocs utilisent la meme fonction de comparaison.

Le probleme peut se poser si on compare deux objets custom differents
(mais de meme taille), dont on a prealablement oublie' le type par
Obj.repr.

Il me semble qu'il faudrait ajouter la ligne:

  if (Custom_ops_val(v1) != Custom_ops_val(v2))
    return ((value)Custom_ops_val(v1) >> 1) - ((value)Custom_ops_val(v2) >> 1);

Ca peut paraitre un peu tire' par les cheveux, mais ca me semble etre
le seul cas ou` [compare (Obj.repr a) (Obj.repr b)] est
potentiellement incorrect.

D'autre part, si Custom_ops_val(v1)->compare == NULL, l'exception
Failure est levee, alors que dans les autres cas c'est Invalid_argument.

        Jacques

TagsNo tags attached.
Attached Files

- Relationships

-  Notes
(0000158)
administrator (administrator)
2003-07-16 17:55

fixed Failure by DD & XL on 2003-07-16
(0000159)
administrator (administrator)
2003-07-18 16:31

> Il me semble que le code pour le cas Custom_tag dans compare.c est
> potentiellement dangereux, car il ne verifie pas que les deux
> blocs utilisent la meme fonction de comparaison.
>
> Le probleme peut se poser si on compare deux objets custom differents
> (mais de meme taille), dont on a prealablement oublie' le type par
> Obj.repr.

Comme tu dis, c'est un peu tiré par les cheveux :-)

> Il me semble qu'il faudrait ajouter la ligne:
>
> if (Custom_ops_val(v1) != Custom_ops_val(v2))
> return ((value)Custom_ops_val(v1) >> 1) - ((value)Custom_ops_val(v2) >> 1);

On peut, par prudence, comparer les Custom_ops_val et s'ils diffèrent,
lever une exception Invalid_argument. Mais comparer les pointeurs
Custom_ops_val est un peu bizarre.

> D'autre part, si Custom_ops_val(v1)->compare == NULL, l'exception
> Failure est levee, alors que dans les autres cas c'est Invalid_argument.

Bien vu. C'est réparé.

- Xavier

(0006812)
doligez (administrator)
2012-01-26 15:18

Heterogenous comparison fixed by XL in 3.12.1 (commit 11037) and trunk [3.13.0] (commit 11123).

FTR, this could be triggered without using Obj, with exceptions or first-class modules.

- Issue History
Date Modified Username Field Change
2005-11-18 10:13 administrator New Issue
2012-01-26 15:18 doligez Note Added: 0006812
2012-01-26 15:18 doligez Severity feature => minor
2012-01-26 15:18 doligez Status acknowledged => closed
2012-01-26 15:18 doligez Resolution open => fixed
2012-01-26 15:18 doligez Fixed in Version => 3.12.1
2012-01-26 15:18 doligez Description Updated View Revisions


Copyright © 2000 - 2011 MantisBT Group
Powered by Mantis Bugtracker