csf_common.h (2996B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #ifndef _CSF_COMMON_E58E5677_950A_424c_B6C2_CA180092E6A2_H 6 #define _CSF_COMMON_E58E5677_950A_424c_B6C2_CA180092E6A2_H 7 8 /* 9 10 This header file defines: 11 12 csf_countof 13 csf_sprintf 14 csf_vsprintf 15 16 */ 17 18 /* 19 General security tip: Ensure that "format" is never a user-defined string. 20 Format should ALWAYS be something that's built into your code, not user 21 supplied. For example: never write: 22 23 csf_sprintf(buffer, csf_countof(buffer), pUserSuppliedString); 24 25 Instead write: 26 27 csf_sprintf(buffer, csf_countof(buffer), "%s", pUserSuppliedString); 28 29 */ 30 31 #ifdef WIN32 32 # if !defined(_countof) 33 # if !defined(__cplusplus) 34 # define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0])) 35 # else 36 extern "C++" { 37 template <typename _CountofType, size_t _SizeOfArray> 38 char (*_csf_countof_helper(_CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray]; 39 # define _countof(_Array) sizeof(*_csf_countof_helper(_Array)) 40 } 41 # endif 42 # endif 43 #else 44 # define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0])) 45 #endif 46 // csf_countof 47 48 #define csf_countof(anArray) _countof(anArray) 49 50 // csf_sprintf 51 52 #ifdef _WIN32 53 // Unlike snprintf, sprintf_s guarantees that the buffer will be null-terminated 54 // (unless the buffer size is zero). 55 # define csf_sprintf(/* char* */ buffer, \ 56 /* size_t */ sizeOfBufferInCharsInclNullTerm, \ 57 /* const char * */ format, ...) \ 58 _snprintf_s(buffer, sizeOfBufferInCharsInclNullTerm, _TRUNCATE, format, \ 59 __VA_ARGS__) 60 #else 61 # define csf_sprintf(/* char */ buffer, \ 62 /* size_t */ sizeOfBufferInCharsInclNullTerm, \ 63 /* const char * */ format, ...) \ 64 snprintf(buffer, sizeOfBufferInCharsInclNullTerm, format, __VA_ARGS__); \ 65 buffer[sizeOfBufferInCharsInclNullTerm - 1] = '\0' 66 #endif 67 68 // csf_vsprintf 69 70 #ifdef _WIN32 71 # define csf_vsprintf(/* char* */ buffer, \ 72 /* size_t */ sizeOfBufferInCharsInclNullTerm, \ 73 /* const char * */ format, /* va_list */ vaList) \ 74 vsnprintf_s(buffer, sizeOfBufferInCharsInclNullTerm, _TRUNCATE, format, \ 75 vaList); \ 76 buffer[sizeOfBufferInCharsInclNullTerm - 1] = '\0' 77 #else 78 # define csf_vsprintf(/* char */ buffer, \ 79 /* size_t */ sizeOfBufferInCharsInclNullTerm, \ 80 /* const char * */ format, /* va_list */ vaList) \ 81 vsprintf(buffer, format, vaList); \ 82 buffer[sizeOfBufferInCharsInclNullTerm - 1] = '\0' 83 #endif 84 85 #endif