none
C26454 算数溢出,为什么这样一个“算数溢出”会出现在MFC的 “ON_NOTIFY 宏”上? RRS feed

  • 问题

  • 我在为一个动态创建的TreeCtrl控件添加,“右键节点,弹出菜单项“的功能

    因此,我使用了 ON_NOTIFY(NM_RCLICK,.....) ,并且把这个宏添加到了 CMainFrame 中。

    虽然在运行过程中我没有碰到任何问题,但是一个“算数溢出”的提示,还是让我觉得不舒服。

    我使用了搜索引擎,依然没有弄清楚,为什么会有“算数溢出”。

    唯一有帮助的信息是,让我选择屏蔽C26454,至于其他的和 C26454 有关的信息却和MFC无关。

    下面是我对这个提示的截图,希望有用。

    2019年10月11日 2:11

答案

  • 你好,

    感谢你在这里发帖。

    他说生成了为负的无符号结果,可以看到结果时(WORD)(int)((0U-0U)-5),这就是负数了,如下图所示,初始定义上NM_RCLICK就是个负值。他是NM_FIRST-5,而NM_FIRST为0,这并没有具体含义,只是方便赋值而已。

    再看下WM_NOTIFY,它将NM_RCLICK以WORD类型传进了函数,这里就发生了强制的类型转换,伴随着变量内容发生改变的风险。

    我们需要再看下WORD类型是什么,它是一个无符号的整形变量,范围为0-65536,所以将负数进行转换时会有报警,因为变量的实际内容发生了改变。以底下代码为例,a最后显示出来的值还是-5。内容有发生改变的风险时会选择报警。但MFC底层编写设计时应该考虑到这些了,对于这类错误平常编写代码时需要考虑,但在你的这个问题内,可以直接忽略。

    #include <iostream>
    #include <windows.h>
    #define a (0U-0U)
    #define b a-5
    int main()
    {
        std::cout << (WORD)(int)b;
    }

    Best Regards,

    Suarez Zhou




    2019年10月11日 3:06

全部回复

  • 你好,

    感谢你在这里发帖。

    他说生成了为负的无符号结果,可以看到结果时(WORD)(int)((0U-0U)-5),这就是负数了,如下图所示,初始定义上NM_RCLICK就是个负值。他是NM_FIRST-5,而NM_FIRST为0,这并没有具体含义,只是方便赋值而已。

    再看下WM_NOTIFY,它将NM_RCLICK以WORD类型传进了函数,这里就发生了强制的类型转换,伴随着变量内容发生改变的风险。

    我们需要再看下WORD类型是什么,它是一个无符号的整形变量,范围为0-65536,所以将负数进行转换时会有报警,因为变量的实际内容发生了改变。以底下代码为例,a最后显示出来的值还是-5。内容有发生改变的风险时会选择报警。但MFC底层编写设计时应该考虑到这些了,对于这类错误平常编写代码时需要考虑,但在你的这个问题内,可以直接忽略。

    #include <iostream>
    #include <windows.h>
    #define a (0U-0U)
    #define b a-5
    int main()
    {
        std::cout << (WORD)(int)b;
    }

    Best Regards,

    Suarez Zhou




    2019年10月11日 3:06
  • 你好,

    请问你的问题解决了吗?如果解决了请标记有价值的回复为答案,我们也欢迎你给出你的解决方案,这会帮助其他社区成员更快地找到解决方案。

    Best Regards,

    Suarez Zhou

    2019年10月14日 5:13
  • 所以,在我的案例中,可以认为是 IDE 对代码的一次“过度检查”吗? 

    那相同的情况,我无视这个错误就可以了吧

    2019年11月12日 8:11
  • 你好,

    广义上可以这么认为,VS也关注你的数据,它会为你的违规操作发出风险报警,尽管你的操作结果上没有问题。这类的风险警告发出是有其原因的,虽然不阻碍程序地运行,但可能会影响结果,我只能说在你的这个案例中是可以忽略的,至于其他情况还是需要具体情况具体分析。

    Best Regards,

    Suarez Zhou


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年11月12日 8:35