• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            勤能補(bǔ)拙,Expter

            成都游戲Coder,記錄游戲開(kāi)發(fā)過(guò)程的筆記和心得!

            關(guān)于 warning C4715問(wèn)題。

            介紹:
             
               關(guān)于warning C4715:not all control paths return a value
              (不是所有的控件路徑都返回值).

            問(wèn)題:
                一個(gè)函數(shù),不是所有路徑都有返回值,如下:

                1) 基本數(shù)據(jù)類型
                對(duì)于函數(shù)的并不是每個(gè)分支都有返回值,那么這樣警告會(huì)提示不是所有路徑都有返回值。

            int   test( int value )
            {
                 
            if ( value > 0 ) return value;
            }


               調(diào)用 int value = test( -1 );

               看下test的匯編代碼.

            關(guān)于8個(gè)程序寄存器一般只有esp寄存器作為入棧,出棧,調(diào)用和返回指令作為棧指針,其余

            比如eax,exc等寄存器都沒(méi)有固定的含義和固定值.
            看下面test匯編代碼.
            int   test( int value )
            {

            ; 4個(gè)寄存器入棧
            ; ebp 用于存放函數(shù)棧的棧頂指針
            ; esp 用于存放函數(shù)棧的棧底指針

            004113A0  push        ebp              ;將寄存器ebp的內(nèi)容壓入程序棧
            004113A1  mov         ebp,esp             ;保留esp寄存器
            004113A3  sub         esp,0C0h             ;為該函數(shù)留出臨時(shí)存儲(chǔ)區(qū)
            004113A9  push        ebx  
            004113AA  push        esi  
            004113AB  push        edi  

            ; 用0CCCCCCCCh初始化堆棧                
            004113AC  lea         edi,[ebp
            -0C0h]        ;lea直接尋址
            004113B2  mov         ecx,30h             ;利用編譯器的offset立即尋址
            004113B7  mov         eax,0CCCCCCCCh         ;eax
            =0CCCCCCCCh
            004113BC  rep stos    dword ptr es:[edi]     ;根據(jù)edi的大小來(lái)重復(fù)指令執(zhí)行次數(shù)

            ; 如果 cmp為真則把value的值保存到eax寄存器中
            ; 否則跳轉(zhuǎn)到地址4113C7h,并沒(méi)有對(duì)eax做處理

                 
            if ( value > 0 ) return value;
            004113BE  cmp         dword ptr [value],
            0 
            004113C2  jle         test
            +27h (4113C7h) 
            004113C4  mov         eax,dword ptr [value] 
            }


            ;各指針出棧,對(duì)應(yīng)前面3條push

            004113C7  pop         edi              ;彈出edi
            004113C8  pop         esi              ;彈出esi
            004113C9  pop         ebx              ;彈出ebx
            004113CA  mov         esp,ebp             ;把esp重新指向ebp(函數(shù)棧的棧頂指

            針,test函數(shù)棧頂)
            004113CC  pop         ebp              ;ebp重新指向test調(diào)用函數(shù)返回地址
            004113CD  ret


            調(diào)用匯編代碼

            int value = test ( 1 );
            004113FE  push        
            1    
            00411400  call        test (4110AFh) 
            00411405  add         esp,4             ;Call test 函數(shù)時(shí)將壓入棧數(shù)據(jù),

            由于只有一個(gè)參數(shù),所以只有4字節(jié)
            00411408  mov         dword ptr [value],eax 

            當(dāng)test 調(diào)用小于0時(shí)最后value指向的eax是一個(gè)0CCCCCCCCh,而對(duì)于基本數(shù)據(jù)類型大多value得到的是0CCCCCCCCh值.
            如果我們的test函數(shù):

            int   test( int value )
            {
                 
            if ( value > 0 ) return value;
                 
            return 0;
            }

            那么匯編代碼會(huì)如下:

                 if ( value > 0 ) return value;
            004113EE  cmp         dword ptr [value],
            0 
            004113F2  jle         test
            +29h (4113F9h) 
            004113F4  mov         eax,dword ptr [value] 
            004113F7  jmp         test
            +2Bh (4113FBh) 
                 
            return 0;
            004113F9  xor         eax,eax   ;將eax清零,作為返回值



               2 )如果返回的是一個(gè)引用對(duì)象
                

            obj &  test( type value )
            {
                
            if( type2 ) return obj;
            }


            obj 
            & ob = test( type1 );

               如果ob是個(gè)空引用的話,就出出錯(cuò),關(guān)于這種出錯(cuò)是否可以通過(guò)什么方式避免呢?

               我覺(jué)得warning C4715就應(yīng)該是error C4715.讓開(kāi)發(fā)者從最開(kāi)始就避免這種錯(cuò)誤的發(fā)生。

             

            posted on 2011-04-09 12:52 expter 閱讀(5855) 評(píng)論(3)  編輯 收藏 引用 所屬分類: 工作筆記生活筆記算法與數(shù)據(jù)結(jié)構(gòu)

            評(píng)論

            # re: 關(guān)于 warning C4715問(wèn)題。 2011-04-09 13:33 Kevin Lynx

            最后一個(gè)例子代碼有點(diǎn)問(wèn)題吧?可以讓編譯器將部分警告視為錯(cuò)誤。
            00411405 add esp,4 ;Call test 函數(shù)時(shí)將壓入棧數(shù)據(jù)
            準(zhǔn)確的說(shuō)這條語(yǔ)句是恢復(fù)堆棧,因?yàn)橹暗膒ush 1。默認(rèn)的cdecl調(diào)用約定是調(diào)用者平衡堆棧。

            win32匯編里約定eax作為返回值寄存器。  回復(fù)  更多評(píng)論   

            # re: 關(guān)于 warning C4715問(wèn)題。 2011-04-09 22:40 expter

            @Kevin Lynx
            最后一個(gè)例子代碼有點(diǎn)問(wèn)題吧?
            有撒問(wèn)題啊?

            Obj & test( type value )
            {
            static Obj obj;
            if( type2 ) return obj;
            }

            即使不是引用
            obj ob = test( type1 );
            這樣也是錯(cuò)的。  回復(fù)  更多評(píng)論   

            # re: 關(guān)于 warning C4715問(wèn)題。 2011-04-10 19:25 Kevin Lynx

            @expter
            我指的是你文章里的test沒(méi)有static Obj obj這句。  回復(fù)  更多評(píng)論   

            亚洲va久久久噜噜噜久久男同| 久久男人中文字幕资源站| 欧美精品丝袜久久久中文字幕| 丰满少妇人妻久久久久久| 久久精品国产亚洲AV麻豆网站 | 青青青国产成人久久111网站| 久久久久亚洲?V成人无码| 国产精品伊人久久伊人电影| aaa级精品久久久国产片| 久久久久AV综合网成人| 97久久精品午夜一区二区| 国产亚洲精品自在久久| 77777亚洲午夜久久多喷| 久久精品国产免费一区| 国产一区二区精品久久凹凸| 久久人人爽人人精品视频| 久久久无码精品亚洲日韩京东传媒 | 国内精品伊人久久久久| 久久青草国产精品一区| 午夜精品久久久久久| 亚洲AV日韩精品久久久久 | 狼狼综合久久久久综合网| 青青青国产精品国产精品久久久久 | 久久se精品一区精品二区国产| 日韩va亚洲va欧美va久久| 97精品依人久久久大香线蕉97| 99999久久久久久亚洲| 久久e热在这里只有国产中文精品99 | 日本精品一区二区久久久| 伊人久久大香线蕉综合影院首页| 2020久久精品国产免费| 久久婷婷午色综合夜啪| 狠狠色丁香久久婷婷综合五月 | 久久无码AV一区二区三区| 国产成人精品免费久久久久| 国内精品伊人久久久久影院对白 | 久久国产热精品波多野结衣AV| 91精品久久久久久无码| 久久综合给合久久狠狠狠97色 | 国产高潮国产高潮久久久91| 久久精品国产2020|