_In_
và _Out_
(lưu ý: không _in_/_out
_ như bạn đã viết, cũng không __In__/__Out__
với dấu gạch đôi, như được viết trong một số câu trả lời khác) đều được cái gọi là SAL Chú thích. Chúng có thể được sử dụng với tùy chọn biên dịch /analyze
và có thể giúp xác định các lỗi và sự cố như tràn bộ đệm, v.v. với bộ đệm C và con trỏ C thô. Ngoài số MSDN documentation on SAL, bạn cũng có thể đọc số này blog post.
Có người mỉa mai (và sai) viết rằng:
"Trong phần còn lại của thế giới, đầu vào là con trỏ const nhưng tôi đoán rằng là quá đơn giản :)."
thiếu thực tế rằng SAL là mạnh hơn hơn thế. Trong thực tế, với SAL bạn cũng có thể chỉ định kích thước tối đa của một bộ đệm đích, chỉ ra tham số nào chứa kích thước bộ đệm đích; ví dụ. nếu bạn mở <strsafe.h>
tiêu đề, bạn có thể đọc mà các chú thích SAL thực tế sử dụng cho StringCbPrintfW
(phiên bản Unicode của StringCbPrintf
) là một cái gì đó như thế:
STRSAFEAPI
StringCbPrintfW(
__out_bcount(cbDest) STRSAFE_LPWSTR pszDest,
__in size_t cbDest,
__in __format_string STRSAFE_LPCWSTR pszFormat,
...)
{
....
Lưu ý cách chú thích __out_bcount(cbDest)
SAL áp dụng cho các tham số pszDest
xác định rằng đây là một con trỏ đến một đầu ra đệm (__out
), mà kích thước được thể hiện theo byte (_bcount
) bởi tham số cbDest
. Như bạn thấy, đây là một chú thích phong phú (phong phú hơn đơn giản "const
" hoặc "không const
"). Theo tôi, SAL là loại vô ích nếu bạn viết mã C++ với các lớp chứa mạnh như std::vector
hoặc std::string
, có kích thước riêng của chúng, v.v. Nhưng SAL có thể hữu ích trong mã C-ish với các con trỏ thô (như một số API Win32).
Về phần thứ hai của câu hỏi của bạn:
"Tại sao chúng ta cần StringCbPrintf
nếu chúng ta đã có sprintf
"
nguyên nhân chủ yếu là sprintf
là một không an toàn và đệm overruns- chức năng dễ bị; thay vào đó với StringCbPrintf
, bạn phải chỉ định kích thước tối đa của bộ đệm đích và điều này có thể giúp ngăn ngừa tràn bộ đệm (là kẻ thù bảo mật).
Đã thêm thẻ "windows" và "winapi", vì câu hỏi này liên quan đến chú thích SAL, đặc biệt là Windows. –
Lưu ý rằng '_in_' và' _out_' không phải là SAL hợp lệ (chúng là '_In_' và' _Out_', với ký tự viết hoa ban đầu). Một SAL hợp lệ thay thế là với dấu gạch dưới kép hàng đầu (và chữ cái viết hoa ban đầu): '__in' và' __out'. –