【问题标题】:gcc 4.9.2 bug in -Werror=sizeof-pointer-memaccess?-Werror=sizeof-pointer-memaccess 中的 gcc 4.9.2 错误?
【发布时间】:2015-03-21 17:58:02
【问题描述】:
#include <string.h>

void test(char charArray [100])
{
    strncpy(charArray, "some text", sizeof(charArray));
}

int main()
{
    char charArray [100];
    test(charArray);
    // EDIT: According to comment from P0W I added this line - where is the difference?
    strncpy(charArray, "some text", sizeof(charArray)); // compiles OK
}

在 SLES 11 SP2 上使用 gcc 4.9.2 编译,使用此命令行 g++ gcc-warning-bug-2.cpp -Wall -Wextra -c -Werror 我收到此警告。由于-Werror 标志,我无法编译该项目:

gcc-warning-bug-2.cpp: In function ‘void test(char*)’:
gcc-warning-bug-2.cpp:5:40: error: argument to ‘sizeof’ in ‘char* strncpy(char*, const char*, size_t)’ call is the same expression as the destination; did you mean to provide an explicit length? [-Werror=sizeof-pointer-memaccess]
  strncpy(charArray, "some text", sizeof(charArray));
                                        ^
cc1plus: all warnings being treated as errors

根据实际gcc 4.9.2文档https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

-Wsizeof-pointer-memaccess
Warn for suspicious length parameters to certain string and memory built-in functions if the argument uses sizeof.
This warning warns e.g. about memset (ptr, 0, sizeof (ptr)); if ptr is not an array, but a pointer, and suggests a possible fix, or about memcpy (&foo, ptr, sizeof (&foo));. This warning is enabled by -Wall.

这应该编译得很好,因为charArray 是一个数组!

错误?我应该向 GNU gcc 开发团队报告吗?

【问题讨论】:

  • 'charArray' 是一个指针,当作为参数传递给函数时,数组衰减为指针。 sizeof 这里给出指针的大小 char*
  • @P0W:查看编辑后的代码。

标签: c++ gcc gcc-warning


【解决方案1】:

你直接掉进了陷阱。

在 C、C++、Objective-C、Objective-C++ 中,声明看起来像“T 数组”的参数实际上具有 T* 类型。

您的参数 charArray 有一个看起来像“100 个字符的数组”的声明,但该声明实际上是“指向 char 的指针”。

因此,strncpy 的第三个参数的值(很可能)为 4 或 8,而不是您似乎期望的 100。

顺便说一句。 strncpy 的使用方式非常危险。

【讨论】:

  • 好的。这对我来说是一个解释。 1)但我可以修复它吗? 2)为什么 strncpy 以这种方式使用它非常危险?是不是因为我不考虑整理0x00
  • 天啊。是的,我现在在没有-Wall 选项的情况下尝试了它,它确实只复制了 8 个字节——我的 Linux 环境中指针的大小!谢谢你!确实有理由使用-Wall -Wextra 开关。他们可以保护您花费大量时间寻找错误!作为我看到的唯一一种解决方案,我必须为函数提供参数charArray 以及大小并考虑终止0x00
  • @PeterVARGA 考虑使用 libbsd 的strlcpy()
  • @CacahueteFrito 感谢您的评论,但这个问题是 5 年前提出的,现在我使用的是 gcc 9.3,这已经是一个完全不同的世界了。
猜你喜欢
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 2020-06-01
  • 2020-09-10
  • 2018-05-01
相关资源
最近更新 更多