2013-10-24 40 views
2

世界GCC沒有預期的警告

我現在將一些32位C代碼移植到64位平臺。

對於下面的代碼,我認爲在我添加選項
"-Wall -Wconversion -Wextra"將代碼編譯爲64位平臺(x86_64而不是IA64)時,應由GCC發出警告。
但是,我沒有得到任何警告...

int len = strlen(pstr); 

奇怪的是,當我的代碼更改爲以下,我可以得到約「的size_t」和「INT」

size_t sz = strlen(pstr); 
int len = sz; 
之間的轉換wanrings

環境信息:

gcc版本4.4.7

的Linux dev217 2.6.32-358.el6.x86_64#1 SMP週五02月22日0點31分26秒UTC 2013 x86_64的x86_64的x86_64的GNU /李nux

任何想法爲什麼?

編輯: 我可以通過一個非常簡單的程序來驗證這一點。

[jsun @/TMP]

[jsun @/TMP]貓test1.c

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

int main() 
{ 

    int len = strlen("testllllll"); 

    printf("len is %d\n", len); 

    return 0; 
} 

[jsun @/TMP] GCC -Wall -Wconversion -Wextra test1.c

[jsun @/TMP]

修改代碼一點後:

[jsun @/TMP]

[jsun @/TMP]貓test1.c

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

int main() 
{ 
    size_t sz = strlen("test111111"); 
    int len = sz;; 

    printf("len is %d\n", len); 

    return 0; 
} 

[jsun @/TMP] GCC -Wall -Wconversion -Wextra test1.c

test1.c:在功能上€〜馬伊納€™:

test1.c:8:警告:轉化爲€~int’從€~size_t’可以改變其值

[jsun @/TMP]

+3

所以你#include ?如果你不這樣做,隱式函數聲明將返回int。你可以發佈你的源文件和gcc輸出嗎? – tristan

+0

我在原帖中粘貼了代碼 – Jacky

+2

我目前沒有編譯器來測試這個,但是你可以嘗試改變它來調用從main(int argc,char * argv)傳入的參數上的strlen() []),看它是否產生警告(例如'strlen(argv [1])')。編譯器可以將strlen(conststring)優化爲精確值(在你的例子中爲10),甚至不包括對strlen的調用。在這種情況下,它可能不會導致警告。 –

回答

3

gcc優化了strlen()函數,因爲它對常量字符串進行操作(結果在編譯時已知)。它可能會用const數字替換結果,所以在這裏不會進行轉換。

更新:指除非指定-fno-內置是 http://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Other-Builtins.html

所以strlen的和許多其他功能內置函數(或爲單個功能被指定-fno-內置函數)。 你可以添加-fno-builtin-strlen到你的gcc選項。如果有投射,它應該警告投。 或者你可以嘗試使用strlen()的變量。海灣合作委員會不會優化

+0

剛剛被檢查 - 這是真的!如果我用OPG示例中的常量字符串替換爲argv [1],我會得到預期的警告 – rabensky

+0

哦,是的,我也只是檢查了這一點。如果在編譯時可以知道結果,Gcc優化了strlen()函數,雖然-O0指定。 – Jacky