【转】VS 2005 CRT函数的安全性增强版本

本文详细介绍了Visual Studio 2005中C++标准库引入的安全性增强版本的CRT函数,包括stdio、stdlib、string等多个领域的函数,如gets_s、itoa_s、strcpy_s等,这些函数旨在防止缓冲区溢出和提高程序安全性。
摘要由CSDN通过智能技术生成
Security-Enhanced Versions of CRT Functions
(CRT = C Runtime Library = C运行时间库)
 
为微软公司对C/C++语言的扩展,其中的一部分已于2003年提交给ISO作为C/C++标准下一版本的修改建议。
安全CRT函数,在原来函数名后添加了“_s”后缀;一般返回出错代码;并将原来的返回值,作为一个参数,添加到函数输入参数列表的最后;对带缓冲区参数的函数,还添加了表示缓冲区大小的输入参数,以防止溢出。
有关的帮助文档参见URL:
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vccrt/html/f87e5a01-4cb2-4379-9e8f-d4693828c55a.htm
1.类型定义
下面是若干安全函数原型用到的类型定义:
#include <crtdefs.h>
typedef int errno_t;
typedef unsigned short wchar_t;
#ifdef _WIN64
typedef unsigned __int64     size_t;
#else
typedef _W64 unsigned int    size_t;
#endif
2.常用安全CRT函数
下面是若干最常用的安全CRT函数原型:
(说明:红色部分为函数名;函数原型后面是其所在的头文件)
 

char *gets_s( char *buffer, size_t sizeInCharacters); // <stdio.h>

wchar_t *_getws_s( wchar_t *buffer, size_t sizeInCharacters); // <stdio.h> or <wchar.h>

 

errno_t _itoa_s( int value, char *buffer, size_t sizeInCharacters, int radix ); // <stdlib.h>

errno_t _itow_s( int value, wchar_t *buffer, size_t sizeInCharacters, int radix ); // <stdlib.h>

errno_t _ultoa_s( unsigned long value, char *str, size_t sizeOfstr, int radix ); // <stdlib.h>

errno_t _ultow_s( unsigned long value, wchar_t *str, size_t sizeOfstr, int radix ); // <stdlib.h>

 

int printf_s( const char *format [, argument]... ); // <stdio.h>

int wprintf_s( const wchar_t *format [, argument]... ); // <stdio.h> or <wchar.h>

int scanf_s( const char *format [, argument]... ); // <stdio.h>

int wscanf_s( const wchar_t *format [, argument]... ); // <stdio.h> or <wchar.h>

int sprintf_s( char *buffer, size_t sizeOfBuffer, const char *format [, argument] ... ); // <stdio.h>

int swprintf_s( wchar_t *buffer, size_t sizeOfBuffer, const wchar_t *format [, argument]...); // <stdio.h> or <wchar.h>

int sscanf_s( const char *buffer, const char *format [, argument ] ...); // <stdio.h>

int swscanf_s( const wchar_t *buffer, const wchar_t *format [, argument ] ...); // <stdio.h> or <wchar.h>

int fprintf_s( FILE *stream, const char *format [, argument ]...); // <stdio.h>

int fwscanf_s( FILE *stream, const wchar_t *format [, argument ]... ); // <stdio.h> or <wchar.h>

int fscanf_s( FILE *stream, const char *format [, argument ]... ); // <stdio.h>

int fwscanf_s( FILE *stream, const wchar_t *format [, argument ]... ); // <stdio.h> or <wchar.h>

 

errno_t strcpy_s( char *strDestination, size_t sizeInBytes, const char *strSource ); // <string.h>

errno_t wcscpy_s( wchar_t *strDestination, size_t sizeInWords, const wchar_t *strSource ); // <string.h> or <wchar.h>

 

errno_t fopen_s( FILE** pFile, const char *filename, const char *mode ); // <stdio.h>

errno_t _wfopen_s( FILE** pFile, const wchar_t *filename, const wchar_t *mode ); // <stdio.h> or <wchar.h>

 

errno_t mbstowcs_s( size_t *pConvertedChars, wchar_t *wcstr, size_t sizeInWords, const char *mbstr, size_t count ); // <stdlib.h>

errno_t wcstombs_s( size_t *pConvertedChars, char *mbstr, size_t sizeInBytes, const wchar_t *wcstr, size_t count ); // <stdlib.h>

 

errno_t rand_s( unsigned int* randomValue); // <stdlib.h>

3.全部安全CRT函数
下面按字母顺序(分组)列出全部安全CRT函数的原型:
(说明:彩色部分为函数名,红色为较为常用的,绿色为不太常用的;函数原型后面是其所在的头文件)

errno_t _access_s( const char *path, int mode ); // <io.h>

errno_t _waccess_s( const wchar_t *path, int mode ); // <io.h>

void *_malloca( size_t size ); // <malloc.h>

errno_t asctime_s( char* buffer, size_t sizeInBytes, const struct tm *_tm ); // <time.h>

errno_t _wasctime_s( wchar_t* buffer, size_t sizeInWords, const struct tm *_tm ); // <time.h>

template <size_t size> errno_t asctime_s( char (&buffer)[size], const struct tm *_tm ); // <time.h> C++ only

template <size_t size> errno_t _wasctime_s( wchar_t (&buffer)[size], const struct tm *_tm ); // <time.h> C++ only

void *bsearch_s( const void *key, const void *base, size_t num, size_t width, int ( __cdecl *compare ) ( void *, const void *, const void *), void * context); // <stdio.h>

errno_t _cgets_s( char *buffer, size_t sizeInBytes, size_t *pSizeRead); // <stdio.h>

errno_t _cgetws_s( wchar_t *buffer, size_t sizeInWords, size_t *pSizeRead); // <stdio.h> or <wchar.h>

template <size_t size> errno_t _cgets_s( char (&buffer)[size], size_t *pSizeRead); // <stdio.h> C++ only

template <size_t size> errno_t _cgetws_s( wchar_t (&buffer)[size], size_t *pSizeRead); // <stdio.h> or <wchar.h> C++ only

errno_t _chsize_s( int fd, __int64 size ); // <io.h>

errno_t clearerr_s( FILE *stream ); // <stdio.h>

errno_t _controlfp_s( unsigned int *currentControl, unsigned int newControl, unsigned int mask); // <float.h>

int _cprintf_s( const char * format [, argument] ... ); // <conio.h>

int _cprintf_s_l( const char * format, locale_t locale [, argument] ... ); // <conio.h>

int _cwprintf_s( const wchar * format [, argument] ...); // <conio.h> or <wchar.h>

int _cwprintf_s_l( const wchar * format, locale_t locale [, argument] ...); // <conio.h> or <wchar.h>

int _cscanf_s( const char *format [, argument] ... ); // <conio.h>

int _cscanf_s_l( const char *format, locale_t locale [, argument] ... ); // <conio.h>

int _cwscanf_s( const wchar_t *format [, argument] ... ); // <conio.h> or <wchar.h>

int _cwscanf_s_l( const wchar_t *format, locale_t locale [, argument] ... ); // <conio.h> or <wchar.h>

errno_t ctime_s( char* buffer, size_t sizeInBytes, const time_t *time ); // <time.h>

errno_t _ctime32_s( char* buffer, size_t sizeInBytes, const __time32_t *time ); // <time.h>

errno_t _ctime64_s( char* buffer, size_t sizeInBytes, const __time64_t *time ); // <time.h>

errno_t _wctime_s( wchar_t* buffer, size_t sizeInWords, const time_t *time ); // <time.h> or <wchar.h>

errno_t _wctime32_s( wchar_t* buffer, size_t sizeInWords, const __time32_t *time ); // <time.h> or <wchar.h>

errno_t _wctime64_s( wchar_t* buffer, size_t sizeInWords, const __time64_t *time ); // <time.h> or <wchar.h>

template <size_t size> errno_t _ctime32_s( char (&buffer)[size], const __time32_t *time ); //  <time.h> C++ only

template <size_t size> errno_t _ctime64_s( char (&buffer)[size], const __time64_t *time); // <time.h> C++ only

template <size_t size> errno_t _wctime32_s( wchar_t (&buffer)[size], const __time32_t *time ); // <time.h> or <wchar.h> C++ only

template <size_t size> errno_t _wctime64_s( wchar_t (&buffer)[size], const __time64_t *time ); // <time.h> or <wchar.h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值