[PATCH] dix: Make small bitfields that store enums unsigned
Alex Deucher
alexdeucher at gmail.com
Fri Dec 21 08:16:18 PST 2012
On Fri, Dec 21, 2012 at 10:37 AM, Aaron Plattner <aplattner at nvidia.com> wrote:
> Commit 31bf81772e146af79b0c456aae2159eba8b0280f changed the clientState field
> from a signed int to a signed int 2-bit bitfield. The ClientState enum that is
> expected to be assigned to this field has four values: ClientStateInitial (0),
> ClientStateRunning (1), ClientStateRetained (2), and ClientStateGone (3).
> However, because this bitfield is signed, ClientStateRetained becomes -2 when
> assigned, and ClientStateGone becomes -1. This causes warnings:
>
> test.c:54:10: error: case label value exceeds maximum value for type [-Werror]
> test.c:55:10: error: case label value exceeds maximum value for type [-Werror]
>
> The code here is a switch statement:
>
> 53 switch (client->clientState) {
> 54 case ClientStateGone:
> 55 case ClientStateRetained:
> 56 [...]
> 57 break;
> 58
> 59 default:
> 60 [...]
> 61 break;
> 62 }
>
> It also causes bizarre problems like this:
>
> client->clientState = ClientStateGone;
> assert(client->clientState == ClientStateGone); // this assert fails
>
> Also change the signedness of nearby bitfields to match.
>
> Cc: Adam Jackson <ajax at redhat.com>
> Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> include/dixstruct.h | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/include/dixstruct.h b/include/dixstruct.h
> index c1236f5..6784819 100644
> --- a/include/dixstruct.h
> +++ b/include/dixstruct.h
> @@ -90,12 +90,12 @@ typedef struct _Client {
> Mask clientAsMask;
> short index;
> unsigned char majorOp, minorOp;
> - int swapped:1;
> - int local:1;
> - int big_requests:1; /* supports large requests */
> - int clientGone:1;
> - int closeDownMode:2;
> - int clientState:2;
> + unsigned int swapped:1;
> + unsigned int local:1;
> + unsigned int big_requests:1; /* supports large requests */
> + unsigned int clientGone:1;
> + unsigned int closeDownMode:2;
> + unsigned int clientState:2;
> char smart_priority;
> short noClientException; /* this client died or needs to be killed */
> int priority;
> --
> 1.8.0.2
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
More information about the xorg-devel
mailing list