none
VS2003升级到VS2005后代码运行结果错误的问题(各位老大救我!) RRS feed

  • 问题

  • 各位老大,碰到一个从VS2003升级到VS2005后代码运行结果错误的问题,请援手。
    1、代码片段:
    ============================================
    int height = 0;
    int width = 0;
    myFunc1(getData(height, width).get(), height, width);
    ============================================
    说明:
    (1)getData函数返回类型为shared_array<BYTE>的数据,同时计算出height和width(height和width均大于0),其具体申明如下:
           boost::shared_array<BYTE> getData(int &height, int &width);
    (2)myFunc1申明如下:
           void myFunc1(boost::shared_array<BYTE> data, int height, int width);
           以上函数中,若height<=0或width<=0则报错。

    2、错误表现:
    在VS2003下,以上的myFunc1(getData(height, width).get(), height, width);完全能正常执行,但在VS2005下,却运行出错(走到myFunc1的height<=0或width<=0则报错的逻辑),Debug发现传递给myFunc1函数的height和width值都是初始值0, 而不是调用getData(height, width)后计算出来的height和width值。估计类似myFunc1(getData(height, width).get(), height, width);这种代码的参数赋值顺序,在VS2003和VS2005是不一样的。
    我把myFunc1(getData(height, width).get(), height, width);修改成如下代码就正常了。
    boost::shared_array<BYTE> data = getData(height, width);
    myFunc1(data.get(), height, width);

    3、问题点
    3.1 以上VS2005上运行错误的原因是什么?
    3.2 其他代码中也许有类似问题,由于代码太多,有何捷径能找到这些地方?能否通过在VS2005中设置什么编译选项来发现类似问题?
    2009年5月12日 15:26

答案

全部回复

  • 函数参数压栈顺序问题,
    myFunc1(getData(height, width).get(), height, width);
    这样的代码是错误的。在假设编译器参数压栈顺序是由左到右。
    当编译器压栈顺序是由右到左的时候height和width就是错误的了。
    2009年5月13日 4:14
    版主
  • SplendourG,非常感谢!
    还想请教一下如下的问题。
    3.2 其他代码中也许有类似问题,由于代码太多,有何捷径能找到这些地方?能否通过在VS2005中设置什么编译选项来发现类似问题?
    2009年5月13日 5:07
  • 在工程属性中C/C++->Advanced中把Calling Convention设为__fastcall(/Gr)。
    不过这需要和调用方形成约定,不知涉及到压栈顺序还有清理栈是由调用方还是执行方清理的问题。
    名字符号也是不一样的。
    2009年5月13日 6:37
    版主
  • 谢谢SplendourG,涨知识了。你说的方法我理解为是通过编译选项来避免我描述的运行出错的问题。
    我想问一下,有没有什么便捷方法,来把类似myFunc1(getData(height, width).get(), height, width);这样的错误代码找出来(比如通过在VS2005中设置什么编译选项,导致编译这样的错误代码时报警告或错误),我想修改它们。(目前只是偶然发现这1处,我怕其他地方也有类似问题,维护一个又老又烂的软件不容易啊。。。)
    2009年5月13日 11:12
  • 如果你要熟悉词法分析和脚本语言如python等,可以做一个。

    2009年5月13日 13:37
    版主
  • SplendourG,果然牛啊,谢谢你提供的思路。
    2009年5月13日 14:53