Warning C26451: Arithmetic overflow

前端 未结 4 1930
庸人自扰
庸人自扰 2021-01-01 20:35

How do I solve these warnings?

// midiNote is a double as it is used in floating point equation
// v is int because t         


        
相关标签:
4条回答
  • 2021-01-01 21:04

    I believe this is a bug in VS2019

    For instance this produces the warning

    double test2(int n)
    {
         return 4.0 * (n - 1);
    }
    

    But this doesn't

    int test2a(int n)
    {
        return 4 * (n - 1);
    }
    

    Yet, the risk of undefined behavior is much greater for the latter. Multiplying by 4 greatly increases the risk of UB since a far large set of n's will produce UB

    Arguably, for a warning to be set that high virtually any arithmetic operation on ints would be warned.

    This answer shows a way to disable this warning in VS 2019 in the code analysis rule set editor.

    Warning C26454: Arithmetic overflow: '-' operation produces a negative unsigned result at compile time (io.5)

    0 讨论(0)
  • 2021-01-01 21:11

    The warnings are telling you that there is a chance that your calculation will overflow the original (smaller) type before conversion to the result (larger) type. In the first case, if v is MIN_INT (-231), the subtraction will underflow, resulting in Undefined Behavior (likely a large positive number) that will then be stored in midiNote. To avoid the warning, convert to the larger type first:

    midiNote = double(v) - 48;
    

    Similarly for your second example.

    While you can know that setMidiNote will not be called with values that will have this problem, the compiler doesn't know and issues this warning to alert you to the potential for a problem.

    0 讨论(0)
  • 2021-01-01 21:16

    I resolved the problem by looking at some Microsoft Docs, but you could also change your variable into a long long type(over the top, I know). It got rid of the errors for me. Hopefully they address this soon.

    0 讨论(0)
  • 2021-01-01 21:23

    I got rid of the warning by change the type of the variable to "unsigned __int64". That's what the Developer Community in Microsoft suggests!

    0 讨论(0)
提交回复
热议问题