【问题标题】:Integer Operation Without Overflow Check无溢出检查的整数运算
【发布时间】:2016-06-08 18:54:54
【问题描述】:

您好,我刚刚对我的代码进行了静态代码分析,但一直收到错误消息

“无溢出检查的整数运算”

谁能帮我解决这个问题或告诉我它的确切含义。我已经尝试使用 check 关键字来解决这个问题,但是当我运行代码时它仍然出现。

List<String> emailList = new List<string>();

if (tbRecipients.Text.Contains(','))
{
    string[] splits = tbRecipients.Text.Split(',');

    for (int i = 0; i < splits.Length; i++)
    {
        if (splits[i].Contains(';'))
        {
            emailList.AddRange(splits[i].Split(';').ToList());
        }
        else
        {
            emailList.Add(splits[i]);
        }
    }
}

ASPX

<asp:TextBox ID="tbRecipients"  runat="server"  ></asp:TextBox>  

【问题讨论】:

  • 您使用什么工具进行分析?它是特别指向一行还是只指向整个代码块?
  • VCG 是的,它指向这一行 for (int i = 0; i

标签: c# asp.net ascx integer-overflow secure-coding


【解决方案1】:

您收到的消息说您可能会在int 上获得“溢出”,这是因为C# 中的ints 是32 bit,因此您只能在其中存储低于2^31 的数字.所以 VCG 告诉你,在执行多个 i++ 时,你最终可能会得到一个 i = 2^31,这会溢出你的 int 并产生意外的代码行为。

这只会在splitted.Length == int.MaxValue 的情况下发生在您的代码中,因为splitted 是一个数组 并且Length 属性是int,所以当您获得i == int.MaxLength 时循环将评估 i == splitted.Length 并将转到 i++ 这将溢出。

但是你的循环说i &lt; splitted.Length,所以i == splitted.Length 不会发生。

底线:我认为 VCG 发现了一条可疑线,但没有什么可担心的。
希望这会有所帮助,祝您编码愉快。

【讨论】:

    【解决方案2】:

    我已经尝试使用检查关键字来解决这个问题

    第一步是理解信息。随机更改代码并不是处理可能报告给您的错误的好方法。

    在这里,没有可能的整数溢出。如果没有关于该工具的详细信息,很难说更多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      相关资源
      最近更新 更多