3

世界

我现在正在将一些 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 Feb 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: 警告:从“size_t”转换为“int”可能会改变它的值

[jsun@/tmp]

4

1 回答 1

4

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 不会优化它

于 2013-10-24T04:55:17.787 回答