繁体   English   中英

在从 VS2003 迁移到 VS2010 时使用 _s 版本的函数,如 _tcssset 、 _tcscpy 等

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

我正在将 MFC 应用程序从 VS2003 迁移到 VS2010。 对 _tcssset、_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视情况而定)。 这将是一样多的工作,但会导致一个更清洁的接口,这是更难在事业缓冲区溢出。

作为一个附带问题,您是否仍然在宽版和窄版中构建代码? 如果没有,我会借此机会完全撕掉 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 );
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM