问题标签 [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++ - Visual Studio 中的警告 C6385
我似乎从 Visual Studio 2019(16.5 预览版以及 16.4 及更早版本)代码分析工具中收到了错误的警告消息。这是一个错误,还是我真的只是错过了什么?
生成的警告(确切地说)是:
警告 C6385:从 'prodlist' 读取无效数据:可读大小为 '(size_t)*32+8' 字节,但可以读取 '64' 字节。
这是生成警告的代码(尽可能少)
如果我将 更改price_profile
为一个int
(及其相应的值),或者如果我更改num_rows
为一个常量(如5
),那么警告就会消失。
c++ - 仅在运行代码分析时添加 /Wall?
在我的常规构建过程中,我已经/W4
打开,还有一些额外的警告,还有一些由于 Visual Studio 的误报太多而被禁用。这大部分工作正常,但我仍然希望不时检查所有/Wall
会发出的警告。
我的偏好是在代码分析期间执行此操作,无论如何我大约每周运行一次。我已经有一个 CA 的自定义规则集文件,但我不知道如何在其中启用其他非 CA 警告。我还尝试查看 .vcxproj 文件以查看其中是否有任何特定于 CA 的内容,但我找不到任何内容。
附加信息:我使用 CMake 来创建项目,所以如果我可以在那里做一些事情,那将是首选,但我可以自己修改我的 CMake 以使用潜在的解决方案。此外,所有项目都是 C++(不是 CLI),除了一个是 C#。
c++ - Microsoft 是否从 MSDN 中的函数定义中删除了源代码注释语言 (SAL) 和调用约定
比如以前的函数定义SetWindowPos
是这样的:
这在调用约定以及哪些参数是可选/输入/输出等方面非常清楚。
然而,现在 MSDN 使它变得更简单,但删除了调用约定和 SAL 注释,如下所示:
问题:无论如何现在可以查看 SAL 注释和调用约定吗?为什么他们想删除它呢?
c - 为什么 SAL 将此循环报告为潜在的缓冲区溢出?
SAL 报告:
这只是 SAL 中的一个错误吗?或者我在这里缺少什么?cchFileName
显然超过 2 个 WCHAR(即 4 个字节)。
c++ - 为什么 vc++ Code Analyze for may-be-null mark raise C6011 on const 成员函数?
这是最小示例,在 Visual Studio 2019 中开始代码分析
为什么 C6011 警告只对调用空类指针的 const 成员函数起作用。但不是非常量成员函数?显然这两个代码都会崩溃。
c - 如何在 Visual Studio 中使用 C 的 SAL 注释编写此函数?
如何使用 C 的 SAL 注释编写此函数?我需要实现一些功能,但我不知道如何声明它们。我只需要 1 个函数作为模型,所以我可以实现其余的。
下面是我的主要 C 文件,其中包含我已经实现的所有句柄,我不需要修改它。
我需要帮助来实现这个注册句柄功能。我可以看到这个注册函数有这两个参数Username**Password并且还定义了数据的类型。我不知道如何使用 SAL 注释编写正确的 C 声明来完成这项工作。
c - 用于返回引用计数对象的 SAL 注释
我正在尝试使用 SAL 注释来防止在使用引用计数对象时出现某些可能的错误。此用例的特定注释不可用(据我所知),但使用锁定注释可以工作。
这将确保每次调用都会Reference
调用Unreference
,这正是我想要的。
然而,这留下了一些空白。如果我有一个引用计数的对象并且我有某种方法可以获取该对象,如果我没有取消引用它,我希望收到警告:
这将触发警告:warning C26165: Possibly failing to release lock 'global_obj.R' in function 'GetObject'.
,这是意料之中的。我可以对GetObject
函数进行注释,使其变为:_Acquires_lock_(_Curr_->R) Object *GetObject(void)
. 这解决了这个问题,但我可能会引入一个新问题,因为我没有收到任何这样的代码警告:
如果我使用输出参数,它可以工作,void GetObject(_At_(*_Curr_, _Acquires_lock_(_Curr_->R)) Object **O)
解决方案也是如此,但我正在尝试改进直接返回对象的现有 API,所以我想避免进行这种更改。
有没有办法做到这一点,或者这是 SAL 无法表达的东西?
c++ - 带有重载赋值运算符的 C6001
这个简化的示例代码在静态分析下引发了 C6001:
我的理解是,之所以提出此警告,是因为假设重载的赋值运算符可能正在读取未初始化的内存。但在这种情况下,我们并没有这样做——我们实际上是在初始化内存。
如何告诉编译器这里的赋值运算符没有使用任何未初始化的内存?我尝试使用几种不同的 SAL 注释来表达这一点,但没有任何效果。
在这种情况下,零初始化内存(即使用foo f{};
or st_facade my_int{};
)不是正确的答案。在实际代码中,这样的初始化可能会产生不可接受的性能影响
[编辑] 出于类似的原因,基于构造函数的初始化也不是正确的答案。我们需要这种类型在创建时未初始化;我们需要通知静态分析器赋值运算符执行初始化。
[编辑 2] 更一般地说,我们需要一种方法来告诉静态分析器“此方法初始化对象”,而无需实现构造函数或对类型的每个实例进行零初始化。
c - Visual Studio“取消引用 NULL 指针”警告
我有一个创建地址的函数,将值连续存储在该地址,然后返回该地址:
但是,我收到一条警告,指出Warning C6011 Dereferencing NULL pointer 'solAddr'
. 经过一些在线搜索,我发现我只需要确保solAddr
不是NULL
带有“if”-语句并且警告消失了:
警告真的意味着solAddr
可能NULL
吗?文本似乎另有说明。该代码在有和没有NULL
检查的情况下都有效,但我对这个警告真正试图告诉我的内容感到困惑。
char - Microsoft SAL - 警告 C28285:对于函数“function_name”,“注释”中有语法错误
目前,Microsoft 没有为较新的 c++ 字符类型提供等效的StringCbLengthA
和:和. 所以,我决定为新的字符类型复制当前的实现。对于,我添加了这个函数:StringCbLengthW
char16_t
char32_t
char16_t
但是,这会生成C28285类型的警告。无论如何,要修复此代码以避免此警告?