Hans Petter Selasky <firstname.lastname@example.org> 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.
Dag-Erling Smrgrav - email@example.com