从VS2003迁移到VS2010时,使用了_tcsset、_tcscpy等函数的s版本

using _s versions of functions like _tcsset , _tcscpy etc while migrating from VS2003 to VS2010

本文关键字:tcscpy tcsset 函数 版本 迁移 VS2003 VS2010      更新时间:2023-10-16

我正在将MFC应用程序从VS2003迁移到VS2010。有成千上万的函数调用,如_tcsset、_tcscpy、_tcsupr等。在迁移后构建时,C4996警告会出现,建议使用这些函数的_s版本。我被要求不要使用_CRT_SECURE_NO_WARNINGS,并通过更改这些调用和使用_s版本来删除所有警告。有成千上万的调用,在许多情况下,TCHAR*是作为参数来自外部的。我不知道目标缓冲区有多大。那么,我的最佳选择是什么呢。?例如

TCHAR* fnc(TCHAR* tsrc, TCHAR* tdest)
{
  _tcsset(tsrc,0);
  _tcscpy(tdest,tsrc);
  return(tdest);
}

如果我需要将这些调用更改为_tcscpy_s。我该怎么办?在这种情况下使用非_s版本不是更好吗?

如果你被告知要将所有函数更改为使用_s,你必须继续执行。你的示例函数必须更改为:

TCHAR* fnc(TCHAR* tsrc, size_t src_els, TCHAR* tdest, size_t dst_els)
{
  _tcsset_s(tsrc, src_els, 0);
  _tcscpy(tdest, dst_els, tsrc);
  return(tdest);
}

然后,你必须改变对它的调用以匹配,可能还必须将长度输入到这些函数中,起泡、漂洗、重复。

另一种选择是切换到std::tstring(其中tstringstringwstring的typedef,视情况而定)。这将是同样多的工作,但将导致一个更干净的接口,更难导致缓冲区溢出。

作为一个次要问题,您是否仍然以宽版本和窄版本构建代码?如果没有,我会利用这个机会完全删除TCHAR,只使用wchar_t

如果不使用std::string/wstring,则可能应该使用SAL注释,因此函数将声明为:

TCHAR* fnc(
     __inout_ecount(src_els) TCHAR* tsrc, size_t src_els, 
     __out_ecount(dst_els) TCHAR* tdest,  size_t dst_els)  

这样,工具集可以(至少在一定程度上)检查您是否传递了正确的值。

您可能还想编写为您计算元素的函数的模板化版本:

 template <size_t s, size_t d>
 TCHAR *fnc( TCHAR (&tsrc)[s], TCHAR (&tdest)[d] )
 {
     return fnc( tsrc, s, tdest, d );
 }
相关文章:
  • 没有找到相关文章