问题标签 [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.

0 投票
3 回答
4759 浏览

visual-studio-2008 - 使用 Visual Studio 2008 进行 Prefast

有什么方法可以在Visual Studio 2008 Professional添加中启用Prefast

我正在尝试编译本机 C++ 代码。

我尝试过以下事情,

  1. 下载的 Windows SDK
  2. 将编译器的 Bin / Include / Lib 路径设置为 SDK。
  3. 为 c/c++ 编译添加了附加选项 (/Analyze:WX-)

我相信这些步骤应该设置适当的编译器来使用 prefast 进行静态分析。此设置实际上适用于 Visual Studio 2005。但是它不适用于 Visual Studio 2008。

它总是有两个问题

  1. 链接:警告 LNK4044:无法识别的选项 '/MANIFESTUAC:level='asInvoker' uiAccess='false'';忽略
  2. 致命错误 LNK1103:调试信息损坏;重新编译模块

我相信 1 的原因是 Windows SDK 没有识别 /MANIFESTUAC 选项。这已在 Visual Studio 2008 中引入。原因 2,不知道 :)。

任何想法/建议/指针都是最受欢迎的。

0 投票
1 回答
3141 浏览

visual-studio - Visual Studio 2008 的 Prefast

在哪里可以找到适用于 Visual Studio 2008 的 Prefast 的下载?我无法通过 Google 或 MSDN 网站找到它。

0 投票
2 回答
4313 浏览

c++ - VS 2010 中的 PreFast?

哪个版本的 VS 2010 有用于原生 c++ 的 PreFast 静态代码分析器?我已经下载了 VS 2010 Ultimate edition 试用版,希望它包含所有功能,但在其中找不到内置 PreFast。我尝试链接 VS 2010 以使用 WDK 的 PreFast 设置它的目录,并在命令行附加选项中添加“/分析”,但无法获得结果。

0 投票
2 回答
594 浏览

c++ - Prefast 中 NULL 取消引用的注释和在 GCC 上编译

我有以下示例代码,想知道我可以使用什么样的注释来避免它们。

问题是,由于 Prefast 只评估它不知道Create初始化指针的函数。

我想我可以通过使用__out头文件中的注释来解决它,classA::Create但是这不起作用。

我想知道__analysis_assume代码中的任何地方是否有一个很好的替代方法,以便 prefast 从函数定义中提取它。

其次,我想知道如何设置我的构建配置,以便我可以在 Linux 上或使用 GCC 使用这些预处理器指令本地构建我的代码。我是否必须检查它是否在 LINUX 版本上,然后将这些注释添加为空宏?

0 投票
1 回答
627 浏览

c++ - 来自 PREfast 的指针无效访问(读取 0*1 的 4 个字节)错误

我正在尝试编译一些看起来像这样的代码:(示例从第 38 行开始,throw 是 45)

被调用的 ctor 看起来像:

当我对此进行分析时,我得到了错误:

1>d:\code\voodooshader\framework\core\vsshader.cpp(45): warning C6385: Invalid data: access 'argument 3', 可读大小为 '1*0' bytes, 但 '4' bytes 可能阅读:行:40、39、41、43

据我所知,这是声称指针有 0 个可读字节,并且我在传递它时尝试使用其中的 4 个(分别不正确和正确)。这是一个 32 位的构建,所以指针应该是 4 个字节。

如果我m_Core将 throw 中的 更改为,我不会在任何地方nullptr收到错误,而不仅仅是在 throw 线上(第 39-41 和 43 行也突然缺少错误)。

更不寻常的是,如果我完全注释掉 throw,我会收到:

1>d:\code\voodooshader\framework\core\vsshader.cpp(56): warning C6385: Invalid data: access 'argument 3', 可读大小为 '1*0' bytes, 但 '4' bytes 可能阅读:行:40、39、41、43、48、49、50、52、54

这在看似不相关的行上给出了相同的错误。

错误的 MSDN 示例似乎与任何有意义的方式无关,讨论了错误的数组访问。

这是某种已知错误、错误还是我只是误读了它?

More importantly, how can I fix it (this is the only warning from the compiler or PREfast, on /w4 /wX, in an 11kloc codebase, because it loves to heap on the hateful irony :P).

Edit: After some discussion and testing, I've discovered two additional oddities:

If I remove the annotations entirely from the _In_ ICore* const pCore parameter, there is no error.

If I change the annotation on that parameter to _Pre_notnull_ ICore * const pCore, there is also no error. _Pre_notnull_ has most of the requirements of _In_, so this is a functional solution for the time being, but does not seem correct.

0 投票
1 回答
563 浏览

c - 结构成员的 PREfast 注释

在我公司的代码中,我们有通用的 get() 和 set() 方法用于某些组件之间的互操作。但是,如果我尝试运行 PREfast,我会被警告淹没,因为 PREfast 没有意识到 get() 方法初始化了给定的参数。

问题是,由于这些方法非常通用,它们不简单地接受一个参数(我可以用_Out_或类似的标记,而是一个结构数组,其中包含应该返回哪些数据的数据。

在代码中(大大简化):

有什么方法可以对此进行注释,以便 PREfast 知道它args.data是由 初始化的get()吗?还是这对于 PREfast 来说太复杂了?

编辑:如果我使用get(1, &args),那么警告就会消失。所以PREfast中有一些启发式可以处理这种情况,但我还没有发现是否可以从外部触发它:

0 投票
0 回答
366 浏览

wdk - libcmt.lib 删除

最近我们对我们的云打印模块进行了一些重大的架构更改(即多线程支持)。现在我必须对其运行 PreFast 检查,但是因为我们使用的当前版本的 Visual Studio 2008 没有集成 PreFast 检查支持,所以我必须通过 Windows DDK 来完成。

我正在尝试使用 WDK 构建源代码,但出现此错误。

错误 LNK2005:“void _cdecl operator delete(void *)”(?3@YAXPAX@Z) 已在 libcmt.lib (delete.obj) 中定义

我相信libcpmt.lib在前一阶段使用的链接器与删除方法的定义相同。源代码还混合了不同模块级别的 c 文件和 cpp 文件。libcmp.lib这可能是它首先使用两者的真正原因libcpmt.lib吗?

无论如何我可以解决这个问题吗?我真的不需要“正确”的方式。我想要的只是构建源代码,以便我可以运行 PreFast 检查(并不真正关心与链接相关的警告)。如果它对此给出任何 PreFast 警告,我可以暂时跳过它。

0 投票
1 回答
329 浏览

windows-7 - WDK7:使用 IoAttachDeviceToDeviceStack 在 PREfast 中给出“必须保留内存”警告

我正在使用 PREFast 检查 Windows7 的一些驱动程序代码构建。以下代码行

发出警告:

deviceObject 是通过先前调用 IoCreateDevice 获得的。有谁知道这个警告意味着什么以及如何摆脱它?

PREfast 帮助说“调用函数时程序在调用函数之前必须获取的资源没有获取。因此,函数调用将失败。”

帮助页面提供的示例围绕在对 KaEnterCriticalRegion 和 KaLeaveCriticalRegion 的调用之间对 ExAcquireResourceLite 和 ExReleaseResourceLite (给出此警告)的一对调用,然后据说可以消除警告,但我不知道如何将此信息应用于我对 IoAttachDeviceToDeviceStack 的调用。

任何意见,将不胜感激。

0 投票
1 回答
218 浏览

c++ - 这种模式在 C++ 中有效吗?

我正在我的项目上运行 PREfast 静态代码分析,它给了我 C6001 'using uninitialized memory' 这种模式的错误:

我试图利用的技巧是允许 select_image 的范围仅限于 if 表达式(即 if (condition) { expression-block = 条件变量的生命周期}。

VS 已经愉快地编译(并且可能会运行它)很长一段时间了。我已经很久没有这样的单步代码了,但据我所知,如果 select_image 的运算符 bool() 返回 true,它只会进入 if 块,并且在退出 if 块时会破坏 select_image 的实例。

PREfast 错了吗?或者这里有什么微妙的东西使我上面的代码和假设不正确?

0 投票
0 回答
182 浏览

c++ - 哪里是询问有关 PREfast 问题的好地方?

哪里是询问有关 PREfast 问题的好地方?

显然,PREfast 有一些限制——有些看起来很愚蠢:

  • 它无法将 a 识别CStringconst TCHAR *二进制兼容)。
  • 它无法理解 anif (FooClass const & foo = FooClass(args))实际上初始化 foo..
  • 它抱怨 shlobj.h 中的 ILIsChild() (应该更正@microsoft)
  • 要求检查 _setmode 的返回值,但 _setmode 的文档表明它为错误调用无效参数处理程序,并返回其先前的模式(检查完全没用!)
  • 使用 DEVNAMES 结构时错误地指示字符数和字节数不匹配(例如 wDriverOffset - 记录为字符数 - 因此不是不匹配)

不确定哪里有人在讨论 PREfast 的使用及其错误和解决方法?