On 1/10/21 9:14 PM, Nathan Chancellor wrote: > On Sun, Jan 10, 2021 at 01:57:26PM -0800, trix@xxxxxxxxxx wrote: >> From: Tom Rix <trix@xxxxxxxxxx> >> >> clang static analysis reports this problem >> >> rnbd-clt.c:1212:11: warning: Branch condition evaluates to a >> garbage value >> else if (!first) >> ^~~~~~ > Ah, is it complaining that the 'if (IS_ERR(sess)) {' section in > find_or_create_sess() does not initialize first even though that will be > caught by the 'if (sess == ERR_PTR(-ENOMEM))' in > find_and_get_or_create_sess() because alloc_sess() only returns an > -ENOMEM error pointer? Reviewing the code, failure looks like it returns only -ENOMEM. So the check is correct but brittle. > >> This is triggered in the find_and_get_or_create_sess() call >> because the variable first is not initialized and the >> earlier check is specifically for >> >> if (sess == ERR_PTR(-ENOMEM)) >> >> This is false positive. >> >> But the if-check can be reduced by initializing first to >> false and then returning if the call to find_or_creat_sess() >> does not set it to true. When it remains false, either >> sess will be valid or not. The not case is caught by >> find_and_get_or_create_sess()'s caller rnbd_clt_map_device() >> >> sess = find_and_get_or_create_sess(...); >> if (IS_ERR(sess)) >> return ERR_CAST(sess); >> >> Since find_and_get_or_create_sess() initializes first to false >> setting it in find_or_create_sess() is not needed. >> >> Signed-off-by: Tom Rix <trix@xxxxxxxxxx> > Every maintainer has their preference for where and how stuff gets > initialized but this makes sense to me. I am not sure the commit above > find_or_create_sess() is needed but again, personal preference. Mostly this removes two unneeded branches at the cost of initializing a variable. Secondary, the static analysis complaint is resolved. Tom > > Reviewed-by: Nathan Chancellor <natechancellor@xxxxxxxxx> > >> --- >> drivers/block/rnbd/rnbd-clt.c | 10 ++++------ >> 1 file changed, 4 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c >> index 96e3f9fe8241..251f747cf10d 100644 >> --- a/drivers/block/rnbd/rnbd-clt.c >> +++ b/drivers/block/rnbd/rnbd-clt.c >> @@ -919,6 +919,7 @@ static struct rnbd_clt_session *__find_and_get_sess(const char *sessname) >> return NULL; >> } >> >> +/* caller is responsible for initializing 'first' to false */ >> static struct >> rnbd_clt_session *find_or_create_sess(const char *sessname, bool *first) >> { >> @@ -934,8 +935,7 @@ rnbd_clt_session *find_or_create_sess(const char *sessname, bool *first) >> } >> list_add(&sess->list, &sess_list); >> *first = true; >> - } else >> - *first = false; >> + } >> mutex_unlock(&sess_lock); >> >> return sess; >> @@ -1203,13 +1203,11 @@ find_and_get_or_create_sess(const char *sessname, >> struct rnbd_clt_session *sess; >> struct rtrs_attrs attrs; >> int err; >> - bool first; >> + bool first = false; >> struct rtrs_clt_ops rtrs_ops; >> >> sess = find_or_create_sess(sessname, &first); >> - if (sess == ERR_PTR(-ENOMEM)) >> - return ERR_PTR(-ENOMEM); >> - else if (!first) >> + if (!first) >> return sess; >> >> if (!path_cnt) { >> -- >> 2.27.0 >>