如何修复编译错误"此函数或变量可能不安全"(strcpy)
How to fix compile error "This function or variable may be unsafe" (strcpy)
我看到了我不久前做的一个旧的简单算法。我使用 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 isn";
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;
}
当您使用任何"不安全"字节复制函数时,您会收到此警告。它主要特定于 MSVC。
若要修复此问题,请使用strcpy_s
,这要求您还传递要复制的最大字节数(应为目标缓冲区的大小)。这可以防止缓冲区溢出。
strcpy_s(chArray, phrase.size()+1, phrase.c_str());
也就是说,在C++中更容易使用std::string
来完成所有这些工作
Visual Studio 编译器说:"strcpy":此函数或变量可能不安全。
这是因为您使用了strcpy
,并且编译器认为这是一个潜在的不安全函数。警告的目的是告知您这种感知到的不安全感。该消息建议您如何禁用警告,以防您希望继续使用该功能。
典型的、更安全的替代方案是改用std::string
。对于您的特定程序,使用strcpy
似乎完全是多余的。您可以使用phrase[i-1]
代替chArray[i-1]
。
那么为什么dev-c++不告诉我呢?
诊断消息由实施决定。您正在将此 IDE 中使用另一个编译器,并且该编译器不会警告您使用strcpy
。
我犯了什么错误吗?
有人可能会争辩说,选择使用strcpy
是一个错误。但这是一个错误,因为它很容易被意外滥用。据我所知,你已经正确使用了它。
也就是说,部分不安全之处在于不正确的使用不一定容易识别。如果这很容易,那么编译器会在您错误地使用它时告诉您。但这并不容易,编译器通常无法做到这一点。
除了使用strcpy
,还有另一个潜在的问题:您泄漏了为字符数组分配的内存。
- C++/CLI 和 C#/VB 与不安全和外部有什么区别?
- 问:Apache Arrow 数组生成器不安全追加
- 不安全的 MPI 非阻塞通信示例?
- 有没有一种简单的方法来检查C++中的不安全表达式
- 为什么静态向下转换unique_ptr不安全?
- 哪些整数操作不安全
- 为什么这个递归 lambda 函数不安全?
- 解决方法:QPixmap:在GUI线程之外使用pixmap是不安全的
- 正在匹配不安全的正则线程
- 如何修复编译错误"此函数或变量可能不安全"(strcpy)
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 实现没有不安全服务器凭据的自定义 AuthMetadataProcessor
- 什么时候关闭__strict_ansi__标志是不安全的
- 原子对象在普通对象安全的任何上下文中都是不安全的
- OpenSSL:将不安全的BIO提升为安全
- 这是对支撑初始器列表的不安全使用情况
- 从 C# 到C++和返回的数组,没有不安全的代码
- 一个线程设置成员,而另一个循环上方 - 是此螺纹 - 不安全
- 访问"std::variant"的不安全、"noexcept"和无开销方式
- 在插入时同时迭代一个映射,这在什么方面是不安全的