Re: HEADSUP usb2 (usb4bsd) to become default in 2 weeks.

[ Available lists | Index of freebsd-current | Month of Dec 2008 | Week of 29 Dec 2008 | Raw email | View thread | Wrap long lines | Reply | Tag ]
From
Dag-Erling Smørgrav <des@des.no>
Date
29 Dec 2008 10:45:11
Subject
Re: HEADSUP usb2 (usb4bsd) to become default in 2 weeks.
Message-ID
864p0n6z0p.fsf@ds4.des.no


[ Hide this part ]
Hans Petter Selasky <hselasky@c2i.net> writes:
> The following function is a candidate for de-constifying. You have a data
> pointer there which is read or write, and to be able to transfer constant
> data you need to do a deconst before passing the pointer to this function.
>
> usb2_do_request_flags(struct usb2_device *udev, struct mtx *mtx,
> struct usb2_device_request *req, void *data, uint32_t flags,
> uint16_t *actlen, uint32_t timeout)

In this particular case, I would create separate wrappers for read and
write requests, and have the read version assert that the direction bit
is set before deconst'ing.

> Deconstifying is not illegal in C using standard pointer arithmetics.
> (void *)((const uint8_t *)(ptr) - (const uint8_t *)0)

Undefined behaviour. You can only compare or perform arithmetic on
pointers to elements in the same array or one element past the end of
the array. The correct way to deconst (if you must) is to cast through
uintptr_t, or in FreeBSD, use the __DECONST() macro.

DES
--
Dag-Erling Smrgrav - des@des.no


Elapsed time: 0.095 seconds