问题标签 [sal]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 奇怪的 SAL 注释警告
我正在尝试为我的项目使用 Micosoft 的 SAL 注释,但是我收到以下警告,我不知道为什么。
例如,我创建了一个新的 C++ 控制台应用程序,并拥有以下代码:
当我使用 Visual Studio 2008 编译时,我收到以下警告:
警告 C6540:在此函数上使用属性注释将使其所有现有的 __declspec 注释无效
在文件“c1xxast”中
我究竟做错了什么?如果我删除_Check_return_
或__in
,警告就会消失。
我找不到对警告 C6550 的任何引用。但是,可以在此处找到相同的文本:http: //msdn.microsoft.com/en-us/library/dd445322.aspx,但这不是很有帮助。
c++ - 微软的源注释语言(SAL)——有什么方法可以利用它吗?
有什么方法可以利用 Microsoft 的 SAL,例如通过保留此信息的 C 解析器?还是由 Microsoft 制造,仅供 Microsoft 内部使用?
它对于很多任务都非常有用,例如为其他语言创建 C 库绑定。
c++ - SAL(源注释语言)的目的是什么,SAL 1 和 2 有什么区别?
如标题中所问:
SAL(源注释语言)的目的是什么,SAL 1 和 SAL 2 有什么区别?
我了解使用的基础知识,这有助于突出传递给函数的每个变量的目的以及用于静态代码分析的各种其他内容,但它实际上有多大不同(忽略参数要求的日益清晰)项目中的其他程序员)?
如果我有以下原型:
这应该“告诉”静态分析器该函数将在成功操作后返回 1,这pTest
是一个不能是的指针nullptr
,pOptional
也是一个可能是也可能不是的指针nullptr
。但是,静态分析器不能从函数定义本身获取这些信息吗?此外,它如何处理获得的信息,例如成功标准?
此外,为什么 SAL 1 和 SAL 2 之间存在差异,为什么微软决定改变他们命名宏的方式(即 from __out
to_Out_
和__success
to _Success_
?)
很抱歉,如果 MSDN 上某处对此进行了详细描述,但我无法在 StackOverflow 上找到它或任何其他问题的详细答案,所以我想我会问,希望能满足我的好奇心。
在此先感谢您的时间!
c++ - Microsoft SAL 如何防止非一错误
这是 MSDN ( http://msdn.microsoft.com/en-us/library/hh916383.aspx )上给出的一个示例,它试图解释 SAL 注释可以帮助找到一个常见的错误。
我不太明白这个例子。在这个例子中,看起来函数签名包含一个名为 的参数count
,因此我们可以使用In_reads_(count)
它来确保src
指向的内存空间至少具有这样的字节数。
我的问题是,如果有这样的签名函数怎么办
在这种情况下,签名不包含有关大小的任何信息。我可以使用 SAL 告诉调试器dest
应该是相同大小还是比 1 字节大src
?
c++ - SAL 注释和指针参数
我一直在阅读有关SAL的内容,但我不清楚指针类型的注释是否适用于引用或其指向的值。例如,如果我有:
_In_
表示“参数必须在pre-state有效,不会被修改。” 它的应用在这里是否意味着t的地址不会改变,或者t的值?
c++ - _Deref_ 和 _Outptr_ sal 注释
Deref和Outptr SAL 注释有什么区别?此外,您何时使用不同类型的Outptr注释,如 _Outptr_result_buffer_all_ 和 _Outptr_result_buffer_?
visual-c++ - _Pre_defensive_ 注释如何工作?
所以我相当熟悉使用 Microsoft Source Annotation Language(VS 2012-2013 风格)来描述带有指针的函数契约。
不过,我很好奇的一件事是,对于带_In_ _Pre_defensive_
注释的被调用者没有首先检查指针的情况,我希望得到与没有它不同的结果。[我们的许多遗留函数都希望这些参数的输入有效,但政策是要仔细检查。] 描述标记为防御而不是自我防御的函数是否存在静态分析错误?
从文档中,
如果函数出现在信任边界,我们建议您使用 _Pre_defensive_ 注释。"defensive" 修饰符修改了某些注解,表明在调用点,接口应该被严格检查,但是在实现主体中它应该假设可能传递了不正确的参数。在这种情况下,在信任边界处首选 In_Pre_defensive_,以指示尽管调用者在尝试传递 NULL 时会收到错误,但函数体将被分析为参数可能为 NULL,并且任何取消引用的尝试未先检查其是否为 NULL 的指针将被标记。
这是一个用于代码分析的小演示程序。我的所有 4 个函数都在静态分析中显示 C6387,但我希望看到一个额外的迹象,表明我的“防御”函数实际上并没有像fun0()
. 添加此限定符有什么好处吗?它确实使声明变得混乱,所以如果它没有帮助,很难证明把它放在那里是合理的。
奖励问题:我在 sal.h 中也看到了一个_In_defensive_(annotes)
注释,但我不明白如何使用它。
谢谢。
c++ - 指向调用者 SAL 错误的指针的输出
我正在尝试将SAL添加到我的代码中...我根据 msdn 工作并在 msdn 示例中发现了错误,不知道如何处理它。
这里很少更改来自理解 SAL的示例“指向调用者的指针的输出(示例:Outptr 注释)”
Outptr 用于注释旨在返回指针的参数。参数本身不应为 NULL,并且被调用函数在其中返回一个非 NULL 指针,该指针指向已初始化的数据。
我的代码:
如果我在启用代码 alalysys 的 VS2013 中编译它,我得到C6001: using uninitialized memory
为了
排。
我的注释中出现了什么问题,我该如何解决?
c++ - 将 _In_ 扩展为 const
除了这个事实,它可能会让每个 Windows C++ 开发人员感到困惑,
_In_
扩展为强制const
(如果尚未存在)以确保 const 正确性不是谨慎的做法吗?
所以
变成
显然 _[In] Out_仍应扩展为空。
编辑:显然第一个问题是,这只在指针或引用参数前面展开时才有意义。
所以也许一个简单的宏扩展是不够的。我还不想放弃强制执行的概念const
。座右铭是:我们已经有了一个SAL
符号来告诉我们什么是参数ro
,什么不是,让我们利用它。
windows - 了解 __deref_out
我是 Windows 编程新手,似乎找不到任何资源来理解这个 SAL 注释的含义。我基本上是在寻找示例,所以我确切地知道这对调用者和被调用者意味着什么。
这里的 MSDN 文章没有帮助。
任何帮助,将不胜感激。