【问题标题】:C4496 and C6387 for using strcpy and strcatC4496 和 C6387 用于使用 strcpy 和 strcat
【发布时间】:2019-12-24 11:02:01
【问题描述】:

我正在尝试通过 strlen() 函数将函数中的 2 个字符串复制到新的动态内存中。

char* PairSortedArrays(char a[], char b[])
{
    char* p1 = (char*)malloc(strlen(a) + strlen(b) + 1);
    if(p1)
    {
    strcpy(p1, a);
    strcat(p1, b);
    }
    return p1;
}

得到编译器错误:

Severity    Code    Description Project File    Line    Suppression State
Error   C4996   'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.   check   C:\Users\97254\source\repos\check\check\Source.c    35  

【问题讨论】:

  • 我有错误 C4996 和 C6387
  • 你没有检查malloc()的返回值
  • 我添加了 if(p1) 仍然有错误 C4496
  • 您使用的是哪个编译器以及它的版本?
  • 检查Why does Visual Studio 2013 error on C4996?。如果它可以解决你的问题。

标签: c


【解决方案1】:

不要使用 strcat,因为你有所有可用的信息。

char *strdupcat(const char *str1, const char *str2)
{
    size_t str1Len;
    char *result = NULL;

    if(str1 && str2)
    {
        result = malloc((str1Len = strlen(str1)) + strlen(str2) + 1);
        if(result)
        {
            strcpy(result, str1);
            strcpy(result + str1Len, str2)
        }
    }
    return result;
}

【讨论】:

  • @TruthSeeker C 有很长的、悲伤的和持续的缓冲区溢出历史。虽然有时您知道副本是安全的,但像 strcpystrcat 这样的函数却经常被不确定地使用。它们很容易被误用,以至于它们的使用总是被认为是不好的。使用更安全的替代品。
  • 哪个更安全?
  • memcpystrcpy link 更安全
  • 在这种情况下,使用 strlen 并不重要,如果我们从未分配的内存中读取,它将在此功能上失败。否则,即使是坏的 sring,我们也会分配足够的内存。
  • memcpy 和 strcpy 一样不安全
【解决方案2】:

我不确定这是您实际问题的一部分,但 strcpy() 不安全,可能导致缓冲区溢出。顺便说一句,你的编译器不应该仅仅因为这个而无法编译。但是基于微软的帖子:

" 一些 C 运行时库函数已被弃用,因为它们不安全并且具有更安全的变体。其他的则被弃用,因为它们已过时。"

https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4996?view=vs-2019

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    较旧的字符串函数,安全性较低的版本被标记为已弃用,新版本具有 _s(“安全”)后缀(示例:strcpy_s)。

    在你的情况下,

    "strcpy" 函数无法判断您要复制的源字符串对于其目标缓冲区是否太大。

    但在secure "strcpy_s"中,是以缓冲区的大小为参数,因此可以判断是否会发生缓冲区溢出。

    示例:

    如果您使用 strcpy_s 将 11 个字符复制到 10 个字符的缓冲区中,那是您的错误; strcpy_s 无法纠正您的错误,但它可以检测您的错误并通过调用无效参数处理程序通知您。

    【讨论】:

      猜你喜欢
      • 2021-06-23
      • 2016-01-21
      • 2013-08-23
      • 2015-08-16
      • 2017-01-18
      • 2017-03-15
      • 2016-03-14
      • 2018-06-21
      • 2016-12-03
      相关资源
      最近更新 更多