GCC没有预期的警告

时间:2013-10-24 02:30:23

标签: c linux gcc 32bit-64bit

世界

我现在将一些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;

环境信息:

gcc版本4.4.7

Linux dev217 2.6.32-358.el6.x86_64#1 SMP Fri 2月22日00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux

任何想法为什么?

编辑: 我可以通过一个非常简单的程序验证这一点。

[jsun @ / TMP]

[jsun @ / tmp] cat 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] cat 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:在函数“main”中:

test1.c:8:警告:从“theize_t”转换为“int”可能会改变其值

[jsun @ / TMP]

1 个答案:

答案 0 :(得分:3)

gcc优化了strlen()函数,因为它在const字符串上运行(结果在编译时已知)。它可能会用const数替换结果,因此这里不会进行强制转换。

更新:参考 的 http://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Other-Builtins.html

所以strlen和许多其他函数都是内置函数,除非指定了-fno-builtin(或者为单个函数指定了-fno-builtin-function)。 你可以添加-fno-builtin-strlen到你的gcc选项。如果有铸造,它应该警告施法。 或者您可以尝试使用带有strlen()的变量。 gcc不会优化