|
1
3
prefast告诉你你的代码有缺陷,不要忽略它。你确实有一个,但你只是匆匆忙忙地知道它。问题是:仅仅因为
/咆哮 有两种方法可以解决这个问题:正确的方法,和黑客。 正确的方法是在运行时处理空指针:
这将使预演安静下来。 技巧是使用注释。例如:
编辑: Here's a link 描述前置注释。无论如何,这是个起点。 |
|
|
2
5
期望使用/分析零警告是不现实的。 它指出了一种情况,即取消引用一个指针 它 无法验证始终有效。据prefast所知,不能保证它永远不会为空。 但这并不意味着 可以 为空。只是证明它安全所需的分析对于prefast来说太复杂了。
您可以使用特定于Microsoft的扩展
如果正确使用断言(在编程过程中捕捉逻辑错误,防止出现 不能 如果是这样的话,我看你的代码没有问题,或者留下警告。添加代码来处理 可以 从不发生是没有意义的。你无缘无故地增加了更多的代码和复杂性(如果它永远不会发生,那么你就无法从中恢复,因为你完全不知道程序将处于什么状态。你只知道它进入了一个你认为不可能的代码路径。 但是,如果使用断言作为实际的错误处理(值 可以 在特殊情况下为空,只是希望它不会发生),那么它就是代码中的一个缺陷。然后需要正确的错误处理(通常是异常)。 永远不要用断言来解决以下问题 可能的 . 使用它们来验证 不可能的 不会发生的。当/analyze给出警告时,看看它们。如果是假阳性,就忽略它(不要抑制它,因为虽然今天是假阳性,但明天签入的代码可能会将它变成真正的问题)。 |
|
|
3
3
首先,断言语句必须保证抛出或终止应用程序。在本例中,经过一些实验,我发现/analyse忽略了模板函数、内联函数或普通函数中的所有实现。相反,您必须使用宏和do{}while(0)技巧,内联抑制 如果你看一下 ATLENSURE (Microsoft在宏中使用analyze assume(),他们还提供了几段非常好的文档,说明为什么以及如何迁移ATL以使用此宏。 作为一个例子,我修改了cppunit_assert宏,以同样的方式清除单元测试中的数千个警告。
|
|
|
4
0
请记住,assert()在零售版本中消失,因此上面代码中的c601警告是绝对正确的:您必须检查pbytes是否为非空,并执行assert()操作。assert()只是在调试错误中满足条件时将应用程序抛出到调试器中。 我做了大量的分析和准备工作,所以如果你还有其他问题,请随时告诉我。 |
|
|
5
-1
你似乎认为
|
|
|
6
-2
我的合著者David LeBlanc会告诉我,这个代码被破坏了,假设你使用C++,你应该使用引用而不是指针,而REF不能为null: |
|
|
J.Yarovich · 我可以在日志文件中写入断言消息吗? 8 年前 |
|
|
Leedehai · C++:汇编代码包含断言结果 8 年前 |
|
|
seldon · 节点。js断言。使用异步函数抛出(Promises) 9 年前 |
|
|
user2738698 · 是否可以检查pcap中是否激活了接口? 10 年前 |