如何修复编译错误“此函数或变量可能不安全”(strcpy)

时间:2019-07-18 19:00:30

标签: c++ string pointers char

我看到我前一段时间做过的一种古老的简单算法。我使用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;
}

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:4)

  

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

这是因为您使用过strcpy,并且编译器认为它是潜在的不安全函数。警告的目的是告知您这种不安全的感觉。该消息建议您在希望继续使用该功能的情况下如何禁用警告。

更安全的一种典型选择是使用std::string。对于您的特定程序,使用strcpy似乎完全多余。可以使用chArray[i-1]代替phrase[i-1]

  

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

诊断消息取决于实施方式。您正在与此IDE一起使用另一种编译器,但是该编译器不会警告您使用strcpy

  

我有什么错误吗?

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

也就是说,部分不安全因素是使用不正确并不一定易于识别。如果很简单,那么编译器会告诉您何时使用不正确。但这并不容易,而且编译器通常无法做到这一点。


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