介紹:
關(guān)于warning C4715:not all control paths return a value (不是所有的控件路徑都返回值).
問題:
一個(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等寄存器都沒有固定的含義和固定值.
看下面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的大小來重復(fù)指令執(zhí)行次數(shù)

; 如果 cmp為真則把value的值保存到eax寄存器中
; 否則跳轉(zhuǎn)到地址4113C7h,并沒有對(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ò)是否可以通過什么方式避免呢?
我覺得warning C4715就應(yīng)該是error C4715.讓開發(fā)者從最開始就避免這種錯(cuò)誤的發(fā)生。