【问题标题】:How to fix compile error "This function or variable may be unsafe" (strcpy)如何修复编译错误“此函数或变量可能不安全”(strcpy)
【发布时间】:2019-11-27 18:39:01
【问题描述】:

我看到了我不久前做过的一个古老的简单算法。我使用 dev-c ++ 完成了它,但现在我在 Visual Studio 中编译它并不起作用。 Visual Studio 编译器说:'strcpy':这个函数或变量可能不安全。考虑改用 strcpy_s。要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS。 (第 17 行)

在这个简单的项目中,您将键入一个短语,然后将短语翻译成十六进制(每个字符)。

那么为什么 dev-c++ 不告诉我呢?我犯了什么错误吗?或者不是......代码还可以吗?我想了解这一点,因为这不是我第一次收到该错误。

代码执行示例:

请插入一个短语:你好世界! 字符串 -hello world!- 以十六进制转换为 68 65 6c 6c 6f 20 77 6f 72 6c 64 21

#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>

using namespace std;

int main()
{
    string phrase;
    char* chArray;

    cout << "Pls insert a phrase:\t";
    getline(cin, phrase);

    chArray = new char[phrase.size() + 1];
    strcpy(chArray, phrase.c_str());         //THE ERROR IS HERE!

    cout << "The string -" << phrase << "- converted in hex is\n";
    for (int i = 1; i < static_cast<int>(phrase.size() + 1); i++)
    {
        int ch = (int)chArray[i-1];
        cout << setbase(16) << ch << " ";
        if (i % 5 == 0)
            cout << "\n";
    }

    return 0;
}

【问题讨论】:

  • 您为什么使用std::string 和c 字符串?不需要chArray,使用phrase即可。
  • 使用_CRT_SECURE_NO_WARNINGS 禁用警告。之所以存在警告,是因为 Microsoft 的一个团队确定了他们认为存在潜在安全风险的标准 C 函数。
  • 顺便说一句,避免这种情况:static_cast&lt;int&gt;(phrase.size() + 1) 只需使用size_t 而不是int
  • 好的,希望您的问题得到解答,但究竟为什么chArray 存在呢?你为什么不直接写int ch = (int)phrase[i-1];?您可以在std::string 上使用[]
  • 基于范围的 for 循环也可以稍微简化这一点。 for (char ch:phrase) { cout &lt;&lt; setbase(16) &lt;&lt; (int)ch &lt;&lt; " "; ... }

标签: c++ string pointers char


【解决方案1】:

当您使用任何“不安全”的字节复制功能时,您会收到此警告。它主要针对 MSVC。

要修复它,请使用strcpy_s,它还要求您传递要复制的最大字节数(应该是目标缓冲区的大小)。这可以防止缓冲区溢出。

strcpy_s(chArray, phrase.size()+1, phrase.c_str());

也就是说,在 C++ 中使用 std::string 更容易

【讨论】:

    【解决方案2】:

    Visual Studio 编译器说:'strcpy':这个函数或变量可能不安全。

    这是因为您使用了strcpy,并且您的编译器认为它是一个潜在的不安全函数。警告的目的是告知您这种感觉缺乏安全性。如果您希望继续使用该功能,该消息会建议您如何禁用警告。

    典型的、更安全的替代方法是改用std::string。对于您的特定程序,strcpy 的使用似乎完全多余。你可以使用phrase[i-1],而不是chArray[i-1]

    那么为什么 dev-c++ 不告诉我呢?

    诊断消息由实施自行决定。您在此 IDE 中使用了另一个编译器,并且该编译器不会警告您使用 strcpy

    我犯了什么错误吗?

    有人可能会争辩说选择使用strcpy 是一个错误。但这是一个错误,因为它很容易被误用。据我所知,您使用正确。

    也就是说,不安全的部分原因是不正确的使用不一定容易识别。如果这很容易,那么编译器会在您错误地使用它时告诉您。但这并不容易,编译器一般做不到。


    除了使用strcpy 之外,还有另一个潜在问题:泄漏了为字符数组分配的内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多