为什么使用_tcscpy_s而不是_tcscpy?

Mr.*_*ous 0 c++ winapi visual-c++

我是 C++ 编程新手。我正在对我的代码执行 SAST 违规检查,扫描会抛出警告:

_tcscpy(destination_array,Source);
Run Code Online (Sandbox Code Playgroud)

在 Source.cpp 文件的第 58 行中发现使用了危险函数 _tcscpy。此类功能可能会暴露信息并允许攻击者完全控制主机

因此,现在我必须使用它来使警告消失:

_tcscpy_s(destination_array,_countof(destination_array),Source);
Run Code Online (Sandbox Code Playgroud)

_tcscpy和之间的实际区别是什么?_tcscpy_s它如何使代码安全?

Ale*_*iev 6

实际的区别在于_s函数在写入之前会检查目标缓冲区。如果缓冲区太小,则程序将被中止,或者报告错误值,具体取决于当前的错误处理程序。

当恶意数据以某种特定方式形成以覆盖其他数据并获得对程序的控制时,这可以防止缓冲区溢出攻击。

当然,只有正确传递目标缓冲区的大小时,这种预防措施才有效。如果没有,缓冲区溢出和攻击仍然可能发生。

即使应用程序没有安全隐患,_s无论如何使用函数来避免难以查明的内存损坏错误也可能很有用。

Visual C++ 提供了 的模板化版本_tcscpy_s,因此对于数组而不是

_tcscpy_s(destination_array,_countof(destination_array),Source);
Run Code Online (Sandbox Code Playgroud)

您可以使用

_tcscpy_s(destination_array,Source);
Run Code Online (Sandbox Code Playgroud)

这更加安全,因为尺寸是推导得出的,因此不可能出现错误的尺寸。