glx: createcontext: silence analyzer warning and make code easier to understand
This warning is probably a false alarm, but it's trivial to fix. | ../glx/createcontext.c: In function ‘__glXDisp_CreateContextAttribsARB’: | ../glx/createcontext.c:172:24: warning: dereference of NULL ‘0’ [CWE-476] [-Wanalyzer-null-dereference] | 172 | switch (attribs[i * 2]) { | | ~~~~~~~^~~~~~~ The situation is too complex for the analyzer to handle: (but also not immediately clear for the human reader) * `attribs` is only NULL when req->numAttribs is 0 * in that case, the for loop is no-op, so `attribs` won't ever be deref'ed. We can make it easier for both analyzer as well as human reader by just putting the whole loop into an `if (req->numAttribs)` and assigning it inside there. There shouldn't be any (practically measurable) extra cost. Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
parent
2b3bbce30b
commit
9ee96639d7
|
@ -80,8 +80,6 @@ __glXDisp_CreateContextAttribsARB(__GLXclientState * cl, GLbyte * pc)
|
||||||
{
|
{
|
||||||
ClientPtr client = cl->client;
|
ClientPtr client = cl->client;
|
||||||
xGLXCreateContextAttribsARBReq *req = (xGLXCreateContextAttribsARBReq *) pc;
|
xGLXCreateContextAttribsARBReq *req = (xGLXCreateContextAttribsARBReq *) pc;
|
||||||
int32_t *attribs = (req->numAttribs != 0) ? (int32_t *) (req + 1) : NULL;
|
|
||||||
unsigned i;
|
|
||||||
int major_version = 1;
|
int major_version = 1;
|
||||||
int minor_version = 0;
|
int minor_version = 0;
|
||||||
uint32_t flags = 0;
|
uint32_t flags = 0;
|
||||||
|
@ -168,63 +166,67 @@ __glXDisp_CreateContextAttribsARB(__GLXclientState * cl, GLbyte * pc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < req->numAttribs; i++) {
|
int32_t *attribs = NULL;
|
||||||
switch (attribs[i * 2]) {
|
|
||||||
case GLX_CONTEXT_MAJOR_VERSION_ARB:
|
|
||||||
major_version = attribs[2 * i + 1];
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GLX_CONTEXT_MINOR_VERSION_ARB:
|
if (req->numAttribs) {
|
||||||
minor_version = attribs[2 * i + 1];
|
attribs = (int32_t *) (req + 1);
|
||||||
break;
|
for (int i = 0; i < req->numAttribs; i++) {
|
||||||
|
switch (attribs[i * 2]) {
|
||||||
|
case GLX_CONTEXT_MAJOR_VERSION_ARB:
|
||||||
|
major_version = attribs[2 * i + 1];
|
||||||
|
break;
|
||||||
|
|
||||||
case GLX_CONTEXT_FLAGS_ARB:
|
case GLX_CONTEXT_MINOR_VERSION_ARB:
|
||||||
flags = attribs[2 * i + 1];
|
minor_version = attribs[2 * i + 1];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GLX_RENDER_TYPE:
|
case GLX_CONTEXT_FLAGS_ARB:
|
||||||
/* Not valid for GLX_EXT_no_config_context */
|
flags = attribs[2 * i + 1];
|
||||||
if (!req->fbconfig)
|
break;
|
||||||
return BadValue;
|
|
||||||
render_type = attribs[2 * i + 1];
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GLX_CONTEXT_PROFILE_MASK_ARB:
|
case GLX_RENDER_TYPE:
|
||||||
profile = attribs[2 * i + 1];
|
/* Not valid for GLX_EXT_no_config_context */
|
||||||
break;
|
if (!req->fbconfig)
|
||||||
|
return BadValue;
|
||||||
|
render_type = attribs[2 * i + 1];
|
||||||
|
break;
|
||||||
|
|
||||||
case GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB:
|
case GLX_CONTEXT_PROFILE_MASK_ARB:
|
||||||
reset = attribs[2 * i + 1];
|
profile = attribs[2 * i + 1];
|
||||||
if (reset != GLX_NO_RESET_NOTIFICATION_ARB
|
break;
|
||||||
&& reset != GLX_LOSE_CONTEXT_ON_RESET_ARB)
|
|
||||||
return BadValue;
|
|
||||||
|
|
||||||
break;
|
case GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB:
|
||||||
|
reset = attribs[2 * i + 1];
|
||||||
|
if (reset != GLX_NO_RESET_NOTIFICATION_ARB
|
||||||
|
&& reset != GLX_LOSE_CONTEXT_ON_RESET_ARB)
|
||||||
|
return BadValue;
|
||||||
|
break;
|
||||||
|
|
||||||
case GLX_CONTEXT_RELEASE_BEHAVIOR_ARB:
|
case GLX_CONTEXT_RELEASE_BEHAVIOR_ARB:
|
||||||
flush = attribs[2 * i + 1];
|
flush = attribs[2 * i + 1];
|
||||||
if (flush != GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB
|
if (flush != GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB
|
||||||
&& flush != GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB)
|
&& flush != GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB)
|
||||||
return BadValue;
|
return BadValue;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GLX_SCREEN:
|
case GLX_SCREEN:
|
||||||
/* Only valid for GLX_EXT_no_config_context */
|
/* Only valid for GLX_EXT_no_config_context */
|
||||||
if (req->fbconfig)
|
if (req->fbconfig)
|
||||||
return BadValue;
|
return BadValue;
|
||||||
/* Must match the value in the request header */
|
/* Must match the value in the request header */
|
||||||
if (attribs[2 * i + 1] != req->screen)
|
if (attribs[2 * i + 1] != req->screen)
|
||||||
return BadValue;
|
return BadValue;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GLX_CONTEXT_OPENGL_NO_ERROR_ARB:
|
case GLX_CONTEXT_OPENGL_NO_ERROR_ARB:
|
||||||
/* ignore */
|
/* ignore */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (!req->isDirect)
|
if (!req->isDirect)
|
||||||
return BadValue;
|
return BadValue;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue