问题标签 [prefast]
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++ - Microsoft SAL 如何防止非一错误
这是 MSDN ( http://msdn.microsoft.com/en-us/library/hh916383.aspx )上给出的一个示例,它试图解释 SAL 注释可以帮助找到一个常见的错误。
我不太明白这个例子。在这个例子中,看起来函数签名包含一个名为 的参数count
,因此我们可以使用In_reads_(count)
它来确保src
指向的内存空间至少具有这样的字节数。
我的问题是,如果有这样的签名函数怎么办
在这种情况下,签名不包含有关大小的任何信息。我可以使用 SAL 告诉调试器dest
应该是相同大小还是比 1 字节大src
?
visual-studio-2012 - 在命令行上运行 MSBUILD 时如何设置本机代码分析日志的输出路径
我在命令行上使用 MSBUILD 构建我的解决方案,如下所示:
/p:RunCodeAnalysis=True
为本地(PREfast)和托管(FxCop)代码创建代码分析结果,但我的问题是,本地代码的分析结果文件没有像$(OutDir)
托管代码结果那样放入。它们存储在obj
每个程序集 (= $(IntDir)
) 的文件夹中。
我跟踪到标准目标文件的路径Microsoft.CodeAnalysis.Targets
,然后更改了行
至
它有效,但我不能要求每个开发人员在他/她的系统上更改这个文件,所以我需要一种在项目文件中设置它的方法。我已经尝试了以下方法,但没有成功:
为每个项目文件添加一个属性(在根级别):
/li>使用所需的属性值调用 MSBUILD:
/li>通过将此行添加到
/li>vcxproj
文件中来使用目标注入<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
:
有谁知道,如何在不触及标准代码分析目标的情况下解决问题?
c - 用于修复 IRQL 级别警告的 Prefast 注释
我正在为 Windows 7 32 位编写设备驱动程序。我正在使用 WDK 版本 7600.16385.1。到目前为止一切进展顺利,但 prefast 一直告诉我我搞砸了 IRQL 级别。特别是当我尝试锁定/解锁共享缓冲区时。
我有一个表示缓冲区的结构,如下所示:
我有两个功能可以锁定和解锁所述缓冲区:
当我编译我的驱动程序时,prefast 告诉我:
因此,我查看了 WdfSpinLockAcquire 和 WdfSpinLockRelease 是如何定义的:
看起来很简单。所以我改变了我的功能看起来一样:
然后我从两个警告变成了许多关于泄漏 ppbBuff 并且仍然没有正确恢复 IRQL 级别的警告:
我使用缓冲区,我没有在任何地方检查错误,所以我认为我锁定正确。任何人都知道如何在这种情况下安抚prefast?谢谢!
编辑:
这是我使用锁定功能的示例:
我锁定缓冲区,删除任何挂起的请求,解锁缓冲区并完成请求。Prefast 告诉我我没有正确恢复 IRQL 级别。当我注释掉锁定/清除/解锁/完成代码时,prefast 又高兴了。
编辑:
我已经升级到VS2015和WDK10+SDK10。我添加了 M'hand BOUGHIAS 建议的注释:
现在我得到以下信息:
我注意到 _Acquires_lock_ 和 _Requires_lock_not_held_ 定义为空,所以我查看了它们并注意到它们需要定义 _PREFAST_ 才能工作。所以我将 _PREFAST_ 添加到我的预处理器定义中。现在我得到了一堆链接错误,但没有更多的 prefast 错误!
我想我在将项目转换为 VS2015 时搞砸了。所以我创建了标准的 KMDF 驱动程序项目,它为您提供了一个很好的构建框架。我在新项目中打开了静态分析并像以前一样定义了_PREFAST_,它也给了我同样的链接错误。
c - 预快速警告:“算术溢出:32 位值被移位,然后转换为 64 位值。”
我已经声明了这样的宏:
使用这样的宏:
其中E是uint64_t数据类型 P是uint8_t 数据类型
Prefast 发出警告:C6297:算术溢出:32 位值被移位,然后转换为 64 位值。结果可能不是预期值。
如何解决这个问题?