You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:15:38