Bugs caused by internally constructed objects
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 25/100
- Tipo di issue
- Bug
- Chiarezza
- Da chiarire
- Stato di attività
- Ferma
- Ambito
- backend-api-design
Direzione di ricerca
Rivedi i contratti delle classi di racket/draw e i punti di ingresso negli esempi: region%, record-dc%, canvas%, bitmap e snip%/copy. Riproduci prima i tre casi; il lavoro sarebbe completo quando fosse definito un comportamento contrattuale deciso e coerente per gli oggetti costruiti internamente, ma l’issue non specifica il design previsto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Some time ago I did a deep dive into the racket/draw contracts. Here is an observation that led me to some bugs: class contracts do not provide a guarantee on objects that are created from within the contract boundary.
Example 1
The numbers given to in-region? are expected to be real?. If you give imaginary numbers
(define reg (new region%))
(send reg in-region? 0+i 0+i)
the correct error from the region% class contract is raised:
; in-region?: contract violation
; expected: real?
; given: 0+1i
; in: the 1st argument of
; the in-region? method in
; region%/c
However, regions can be created indirectly via the clipping region
(define r-dc (new record-dc%))
(send r-dc set-clipping-rect 0 0 550 400)
(define reg (send r-dc get-clipping-region))
(send reg in-region? 0+i 0+i)
and such will give an internal error since the region was not created through the protected region% class:
; cairo_in_fill: given value does not fit primitive C type
; C type: _double*
; value: 0.0+1.0i
Example 2
The fifth argument to get-argb-pixels is expected to be bytes?
(define bmp (make-bitmap 550 400))
(send bmp get-argb-pixels 0 0 0 0 #f)
and gives an error as such
; get-argb-pixels: contract violation
; expected: bytes?
; given: #f
; in: an and/c case of
; the 5th argument of
; the get-argb-pixels method in
; the range of ...
But bitmaps can be created through the make-bitmap method of canvases
(define frame (new frame% [label "Example"]))
(define canvas (new canvas% [parent frame]))
(define bmp (send canvas make-bitmap 550 400))
(send bmp get-argb-pixels 0 0 0 0 #f)
and in such a case an internal error is raised because it's unprotected
; bytes-length: contract violation
; expected: bytes?
; given: #f
Example 3
The blink-caret method of snips expects a dc<%>
(define sn (new snip%))
(send sn blink-caret #f #f #f)
and the contract gives this error
; blink-caret: contract violation
; expected: (is-a?/c dc<%>)
; given: #f
; in: the 1st argument of
; the blink-caret method in
; the 2nd conjunct of ...
However, cloning the snip constructs a new object that is not protected
(define sn (new snip%))
(define sn2 (send sn copy))
(send sn2 blink-caret #f #f #f)
and gives this different error
; blink-caret method of snip%: expected argument of type <dc<%> instance>; given: #f; other arguments: #f #f
which doesn't come from a contract check, but is a (usually redundant) defensive check that is present in the blink-caret method.
Summary
These are just a few instances I found in racket/draw—there are probably quite a few more. I'm not sure what the takeaway is. My thought is that using (is-a?/c my-class%) and then subsequently assuming that objects satisfy the class contract on my-class% is dangerous since it assumes that my-class% objects are only constructed through the protected constructor. Using object/c contracts everywhere instead of is-a?/c isn't a panacea either because, as far as I know, they will not get collapsed and wrappers might quickly accumulate. So while these bugs that I mentioned can be fixed individually, I feel as though there is a deeper concern here with respect to class contracts in general.
- Lingua principale
- Racket
- Stelle
- 19
- Fork
- 24
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di racket/draw
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 52/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 43/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
Eyevinn/open-videocore#1256 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
[Bug][API] Switching workflow versions leaves schedules onlineForse già presa @zhuangchong l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
apache/dolphinscheduler#18731 ·
I maintainer di solito rispondono entro 1 giorno