c++ - GCC 关于 strncpy 使用的误报警告?

标签 c++ c g++ gcc-warning

关于 strncpy 警告的另一个问题。

代码如下:

#include <cstring>

extern char g_dest[16];
extern char g_src[16];

char* mycopy()
{
    char * x = strncpy ( g_dest, g_src, sizeof ( g_dest ) - 1 );
    return x;
}

使用 g++ 版本 8.3 编译它:

$ g++ --version
g++ (GCC) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -Wall -Wextra -Werror -O3 -c strncpy-warning2.cxx
strncpy-warning2.cxx: In function ‘char* mycopy()’:
strncpy-warning2.cxx:8:24: error: ‘char* strncpy(char*, const char*, size_t)’ output may be truncated copying 15 bytes from a string of length 15 [-Werror=stringop-truncation]
     char * x = strncpy ( g_dest, g_src, sizeof ( g_dest ) - 1 );
                ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors

可以通过以下任一方法解决该警告:

  1. 使 g_src 比 g_dest 短:
$ cat strncpy-warning2.cxx
#include <cstring>

extern char g_dest[16];
extern char g_src[15];

char* mycopy()
{
    char * x = strncpy ( g_dest, g_src, sizeof ( g_dest ) - 1 );
    return x;
}
$ g++ -Wall -Wextra -Werror -O3 -c strncpy-warning2.cxx
$
  • 或者在 g_dest 末尾显式添加 NUL 终止符:
  • $ cat strncpy-warning2.cxx
    #include <cstring>
    
    extern char g_dest[16];
    extern char g_src[16];
    
    char* mycopy()
    {
        char * x = strncpy ( g_dest, g_src, sizeof ( g_dest ) - 1 );
        g_dest[ sizeof( g_dest ) - 1 ] = '\0';
        return x;
    }
    $ g++ -Wall -Wextra -Werror -O3 -c strncpy-warning2.cxx
    $
    
  • 或者如果我将 g_src 设置为指针而不是数组:
  • $ cat strncpy-warning2.cxx
    #include <cstring>
    
    extern char g_dest[16];
    extern char* g_src2;
    
    char* mycopy()
    {
        char * x = strncpy ( g_dest, g_src2, sizeof ( g_dest ) - 1 );
        return x;
    }
    $ g++ -Wall -Wextra -Werror -O3 -c strncpy-warning2.cxx
    $
    

    我知道 GCC 正在尝试警告 strncpy 使用中的潜在错误,但是,我不明白为什么我们不能对 2 个相同大小的数组执行 strncpy ?为什么警告消息显示输出可能被截断? (即,我找不到输出可能被截断的示例,除非GCC假设g_src可能不一定是有效的以NUL结尾的c字符串.)

    通过谷歌搜索,我在 GCC bugzilla 中看到了类似的案例:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87028但是,我不确定这是否是相同的情况,因为最后被标记为“已修复”,但显然我的问题在 GCC 10.2 中仍然存在。

    谢谢!

    最佳答案

    当源和目标大小相同且相当小时,最好的(最有效、最简单、最容易理解成功和错误情况)是使用 memcpy。 GCC 不会就此警告您。

    如果您只是希望 GCC 不提示您的 strncpy() 调用,即使它不安全,您也可以将其括在括号中,如下所示:

    char * x = (strncpy ( g_dest, g_src, sizeof ( g_dest ) - 1 ));
    

    GCC 将其理解为“我知道自己在做什么,不要试图将我从自己手中拯救出来。”

    关于c++ - GCC 关于 strncpy 使用的误报警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66930308/

    相关文章:

    c++ - 可变长度数组在主函数中编译,但在类声明中不编译?

    c++ - 用于构建链表的宏

    c++ - 关于字符串对象生命周期的一些问题

    c++ - 如果我使用 Array 而不是 Vector,有什么缺点吗?

    c++ - 错误处理方法的首选方法

    c - 为什么C程序栈不向下增长?

    c - 我的第二个 scanf 不起作用 - 我该怎么办?

    java - 将 mat 从 java 传递到 c++ jni android arm64-v8a 32/64 位的问题

    CUDA-C导入位图图像

    linker - 使用 g++ 时由于共享库中可用的头文件而导致编译错误