【VS2022】Microsoft 源代码注释语言 SAL

M i c r o s o f t Microsoft Microsoft 源代码注释语言 S A L SAL SAL

c 复制代码
/**
 * @file            
 * @author			jUicE_g2R(qq:3406291309)------------彬(bin-必应)
 *						通信与信息专业大二在读	
 * 
 * @brief			Microsoft 源代码注释语言 SAL
 * 
 * @copyright		2023.10
 * @COPYRIGHT			 原创技术笔记:转载需获得博主本人同意,且需标明转载源
 *
 * @language        C/C++
 *
 * @IDE			   Base on Microsoft Visual Studio 2022
 */

jUicE_g2R的个人主页

文章目录

  • [M i c r o s o f t Microsoft Microsoft 源代码注释语言 S A L SAL SAL](#M i c r o s o f t Microsoft Microsoft 源代码注释语言 S A L SAL SAL)
  • [1 定义](#1 定义)
  • [2 简述作用](#2 简述作用)
    • [2-1 举个栗子](#2-1 举个栗子)
    • [2-2 S A L SAL SAL 的检错能力](#2-2 S A L SAL SAL 的检错能力)
  • [3 四种基本类型的参数 ------ 对 形参 形参 形参 的注释](#3 四种基本类型的参数 —— 对 形参 形参 形参 的注释)
    • [3-1 参数注释的区别](#3-1 参数注释的区别)
    • [3-2 Outptr](#3-2 Outptr)
    • [4 对 形参 形参 形参 的注释](#4 对 形参 形参 形参 的注释)
    • [5 哪些情况添加 S A L SAL SAL 是必要](#5 哪些情况添加 S A L SAL SAL 是必要)

快速传送到 Microsoft 官方教程

1 定义

M i c r o s o f t Microsoft Microsoft 源代码注释语言 ( S A L SAL SAL ) 提供一组描述函数如何使用其参数 的注释,有关注释的假设以及完成注释时的保证。 注释是在头文件 <sal.h> 中定义的。

c 复制代码
#include <sal.h>

同时它也叫:代码安全增强 与 标准注解 语言

2 简述作用

M i c r o s o f t Microsoft Microsoft 教程原话是:

1) S A L SAL SAL 是让编译器为你检查代码的一种低成本的方法

2)使用 S A L SAL SAL 注释减少代码缺陷

其实就是提高 D e b u g Debug Debug 的效率!!!

其次,使用了 S A L SAL SAL 相当于给代码后面添加的注释一样,只不过面向不是其他人,而是编译器( M i c r o s o f t Microsoft Microsoft 教程原话是:编译器无法读取文档或非正式注释)

2-1 举个栗子

memcpy 将源缓冲区中的 count 个字节复制到目标缓冲区:

不使用 S A L SAL SAL

c 复制代码
void * memcpy(
   void *dest,
   const void *src,
   size_t count
);

此时编译器不知道传入的参数有什么作用。

使用 S A L SAL SAL

c 复制代码
void * memcpy(
   _Out_writes_bytes_all_(count) void *dest,		//参数是只读的,不进行修改
   _In_reads_bytes_(count) const void *src,			//参数是只写的
   size_t count
);

不懂继续看下面的表

2-2 S A L SAL SAL 的检错能力

c 复制代码
_Out_writes_bytes_all_(count)						//count向编译器注明了参数的空间大小

( c o u n t ) (count) (count) 注明了空间范围,这对编译器检查 空间溢出 空间溢出 空间溢出 这种 B u g Bug Bug 的效率无疑大大提高了。

空间溢出 空间溢出 空间溢出 的问题可能存在于 数组在遍历时读过头了 ,正式点叫:差一错误(BUG: O F F − B Y − O N E OFF-BY-ONE OFF−BY−ONE ERROR)

3 四种基本类型的参数 ------ 对 形参 形参 形参 的注释

类别 参数注释 说明
输入到调用的函数 _In_ 数据传递给调用的函数,并被视为只读
输入到调用的函数并输出到调用方 _Inout_ 可用数据传递到函数中,并可能进行修改。
输出到调用方 _Out_ 调用方只为调用的函数执行写入操作提供空间。 调用的函数将数据写入该空间。
指针输出到调用方 _Outptr_ 与"输出到调用方"一样。 调用的函数返回的值是一个指针。

下表显示了如何区分必需参数和可选参数:

参数为必需参数 参数为可选参数
输入到调用的函数 _In_ _In_opt_
输入到调用的函数并输出到调用方 _Inout_ _Inout_opt_
输出到调用方 _Out_ _Out_opt_
指针输出到调用方 _Outptr_ _Outptr_opt_

这些注释帮助以正式且准确的方式识别可能的未初始化值和无效空指针的使用。 将 NULL 传递给必需参数可能会导致崩溃,或者可能会导致返回"失败"错误代码。 无论哪种情况,函数都无法成功完成其工作。

3-1 参数注释的区别

_In_ _In_opt_
可否修改
可否接受空指针

_Out__Out_opt__Inout__Inout_opt_ _Outptr__Outptr_opt_ 的关于空指针( N U L L NULL NULL)的接受性区别同理

3-2 Outptr

面向 指针 指针 指针 的注释,以 _Outptr_ 不可接受空指针的范例展示其应用

c 复制代码
void GoodOutPtrCallee(_Outptr_ int **pInt)
{
   int *pInt2 = new int;						//为(局部)指针的指向对象分配内存空间
   *pInt2 = 5;								   	//给(局部)指针的指向对象赋值
   *pInt = pInt2;								//赋地址,pInt也指向pInt2的指向对象
}

void BadOutPtrCallee(_Outptr_ int **pInt)
{
   int *pInt2 = new int;
   // Did not initialize pInt buffer before returning!
   *pInt = pInt2;
}

void OutPtrCaller(void)
{
   int *pInt = NULL;							//pInt:地址变量
   GoodOutPtrCallee(&pInt);						//传入指针的地址
   BadOutPtrCallee(&pInt);
}

4 对 形参 形参 形参 的注释

可以对 函数 的 返回值 返回值 返回值 r e t v a l retval retval 进行注释

典型的栗子: r e t v a l retval retval 的类型是 b o o l bool bool 型的

_Success_ 注释与 _Out_ 组合:

c 复制代码
_Success_(return != false) // Can also be stated as _Success_(return)
bool GetValue(_Out_ int *pInt, bool flag)
{
   if(flag) {
      *pInt = 5;
      return true;
   } else {
      return false;
   }
}

当它为 t r u e true true 时,指示函数已成功

5 哪些情况添加 S A L SAL SAL 是必要

  • 所有指针参数
  • 提供值范围注释(如数组,容器一类)
相关推荐
徒步僧4 小时前
ThingsBoard规则链节点:RPC Call Reply节点详解
qt·microsoft·rpc
憧憬一下9 小时前
Pinctrl子系统中Pincontroller和client驱动程序的编写
arm开发·嵌入式·c/c++·linux驱动开发
Bunny Chen13 小时前
如何缩小PPT演示文稿的大小?
windows·microsoft·powerpoint
鹿痴哇15 小时前
(没有跳过联网激活)导致使用微软账号激活电脑---修改为本地账户和英文名字
microsoft
askah66442 天前
mfc140u.dll丢失怎么办? mfc140u.dll文件缺失的修复技巧
windows·经验分享·游戏·microsoft·dll修复
中游鱼2 天前
解决 Hypack 安装不能正常运行的引导及微软 VC++ 运行库 VCRedist
c++·microsoft·hypack·vc++运行库
小蜗的房子2 天前
SQL Server 2022安装要求(硬件、软件、操作系统等)
运维·windows·sql·学习·microsoft·sqlserver·操作系统
SandyXu012 天前
C#、C和C++的主要区别
c语言·c++·microsoft·c#
Ares-Wang3 天前
net core Autofac 替换默认的服务容器 DI,微软自动的容器 不支持命名选项的
android·microsoft
qq5652219613 天前
c# 判断字符串是否是 decimal
windows·microsoft·c#