我知道这个问题在SO中被问过很多次,但这是与其他问题不同的。
编译器错误:使用可能不安全的参数进行函数调用
视觉工作室警告 C4996
x实用程序 (2227(: 警告 C4996:"标准::_Copy_impl">
失败的代码片段
DWORD dwNumberOfNames = pExportDirectory->NumberOfNames;
LPDWORD dwNames = (LPDWORD)((LPBYTE)hDLL + pExportDirectory->AddressOfNames);
std::vector< std::string > exports;
std::copy(
dwNames,
dwNames + dwNumberOfNames,
[&exports, &hDLL](DWORD dwFuncOffset)
{
std::string fname = std::string((PCHAR)((PBYTE)hDLL + dwFuncOffset));
exports.push_back(fname);
}
);
编译器错误
错误1 错误 C4996:"std::_Copy_impl":使用参数调用函数 这可能不安全 - 此调用依赖于调用方来检查 传递的值是正确的。要禁用此警告,请使用 -D_SCL_SECURE_NO_WARNINGS。请参阅有关如何使用 Visual C++ 'Checked Iterators' C:\Program Files (x86(\Microsoft Visual Studio 的文档 11.0\VC\include\x实用程序 2176
问题
考虑到 C4996,意味着该函数被标记为已弃用问题出在哪里?
- 是使用 std::copy 是 MS 认为不安全并且会被弃用吗?
- 是因为我用了
std::copy
和C Array
吗? - 是因为我使用 Lambda 表达式的方式吗?
- 如果 std::copy 被弃用,如果我需要可移植,还有什么替代方案。
注意
我知道,如何抑制警告,但我很好奇,问题的根本原因是什么?
另外,对我来说同样重要的是,在不影响代码质量的情况下处理此问题的便携式方法。
您没有根据 msdn 调用std::copy
:http://msdn.microsoft.com/en-us/library/x9f6s1wf.aspx
该函数签名如下:
template<class InputIterator, class OutputIterator>
OutputIterator copy(
InputIterator _First,
InputIterator _Last,
OutputIterator _DestBeg
);
那里没有函子/lambda的地方。
你也没有打电话给std::copy_if
:http://msdn.microsoft.com/en-us/library/ee384415.aspx
template<class InputIterator, class OutputIterator, class BinaryPredicate>
OutputIterator copy_if(
InputIterator _First,
InputIterator _Last,
OutputIterator _Dest,
Predicate _Pred
);
由于您没有输出迭代器,因此谓词也不会返回布尔值。
看起来你想要std::transform
:http://msdn.microsoft.com/en-us/library/391xya49.aspx
template<class InputIterator, class OutputIterator, class UnaryFunction>
OutputIterator transform(
InputIterator _First1,
InputIterator _Last1,
OutputIterator _Result,
UnaryFunction _Func
);
并且您应该在输出迭代器中返回所需的值。 所以它会是这样的:
std::transform(
dwNames,
dwNames + dwNumberOfNames,
std::back_inserter(exports),
[&hDLL](DWORD dwFuncOffset) // This lambda is WRONG
{
// THIS LINE IS WRONG
std::string fname = std::string((PCHAR)((PBYTE)hDLL + dwFuncOffset));
return fname;
}
);
我的 lambda 错了。 您需要数组的 ELEMENTS(我不确定类型(的输入作为 lambda 的参数,并返回要插入到 exports
向量中的内容。
你可能也不知道back_inserter
. 它位于<iterator>
标题中。 请参阅此处:http://msdn.microsoft.com/en-us/library/12awccbs.aspx 和此处:http://www.cplusplus.com/reference/iterator/back_inserter/
这可能不是100%的答案,但有了这个,我认为你可以到达你想去的地方。
本身并不std::copy
,我认为您的问题是使用 LPDWORD 进行复制,这使得 Visuall C++认为您正在执行 C 字符串复制,因为LPDWORD
不是检查迭代器。
http://msdn.microsoft.com/en-us/library/ttcz0bys(v=vs.120(.aspx