SonarQube提示C#接口代码条件恒为false问题原因及修复方法
SonarQube提示
if (result == null)恒为false问题修复 问题根因
这个问题属于典型的空引用判断顺序错误:
- 代码从仓储层拿到
result对象后,先执行了if(result.status == "001")的逻辑,直接访问了result的status属性 - 如果
result真的为null,访问result.status时会立刻抛出NullReferenceException空引用异常,代码直接进入外层catch块,永远走不到后面的if (result == null)判断分支 - SonarQube静态扫描识别到了这个逻辑漏洞,因此提示该判断恒为false、块内代码不可达。
除此之外该判断块内本身还存在二级bug:如果代码真的进入result == null分支,块内写的result.message = xxx会再次触发空引用异常,和判断逻辑自相矛盾;同时该分支打日志用了和参数校验完全相同的文案"Mobile no or Null request received",会误导问题排查。
可落地修复方案
核心调整逻辑是先判空,再访问对象属性,同时修正分支内的错误赋值、日志和返回逻辑:
- 把
result == null的判断移动到所有访问result属性的逻辑之前 - 删除null分支中对
result.message的赋值操作(null对象不存在该属性),直接读取多语言文案返回即可 - 修正null分支的日志文案,和参数校验场景做区分
- 统一多语言变量命名,避免和其他错误分支的变量重名混淆
修复后对应代码段如下:
var result = await sendSMSRepository.SendSMS(req, cHeader); // 优先判断空引用,避免后续访问属性抛出异常 if (result == null) { APILog.LogInformation(System.Reflection.MethodBase.GetCurrentMethod().Name, cHeader.uuid, "Send SMS repository returned null response"); var errorMsg002 = await Translation.Translation.GetRedisCache(cHeader.uuid, "core.alert.002", cHeader.channel); string errText = errorMsg002.messageCode != "001" && errorMsg002.messageCode != "999999" ? errorMsg002.messageText : "Error occurred, please try again after few minutes"; return NotFound(errText); } // 判空通过后再访问属性,无空引用风险 if(result.status == "001") { var errorMsg001 = await Translation.Translation.GetRedisCache(cHeader.uuid, "core.alert.001", cHeader.channel); result.message = errorMsg001.messageCode != "001" && errorMsg001.messageCode != "999999" ? errorMsg001.messageText : "Invalid Mobile Number or Message"; return BadRequest(result); } return Accepted(result);
调整后SonarQube的静态检测报错会直接消除,同时空引用异常风险、日志误导问题也会一并解决。
内容的提问来源于stack exchange,提问作者NAKED_DEVELOPER
相关产品推荐
相关产品推荐

