Visual Studio 2019 16.9中的静态分析修复、改进和更新

C++静态分析团队的目标是使您的C++编码体验尽可能安全。我们正在添加更丰富的代码安全检查,并解决发布在 C++开发者社区 第页。感谢您参与我们的工作,并就过去的版本和早期预览给了我们很好的反馈。未来,C++团队将提供VisualStudio的每个GA版本的代码分析错误和崩溃修复列表。下面是从VS 2019 16.8到16.9的改进和错误修复的汇编 代码分析 Cpp核心检查 .

null

分析崩溃修复:

  • 对非地址和非数组对象的地址使用索引运算符。
void function() {
    int buf{};
    ((unsigned char*)&buf)[3] = 1;
}
  • 具有超过255个参数的函数将在分析过程中导致崩溃。
  • 数组成员字段地址在动态初始值设定项函数中转换不正确。
  • 修复了/analyze中聚合初始化的内部编译器错误。
char c[]{'1', {}};
  • 修复了分析位字段和枚举时导致的崩溃。
struct TestStruct {
public:
    enum TestEnum : char { Dummy };
    TestEnum    m1 : 1;
    TestEnum    m2 : 1;
    short       m3;
}

TestStruct Test() {
    return{ TestStruct::Dummy, TestStruct::Dummy, {} };
}
  • 指定由三个元素组成的数组,但在初始值设定项列表中仅提供两个元素。
#include <array>
#include <string>
using namespace std;
void function() {
    array<string, 3> arr {"one", "two"};
}
  • 修复了空KMDF项目的崩溃。

错误修复:

  • 当初始化或更新对象的函数失败时,在对象的析构函数中解决了嘈杂的警告。
  • 支持GSL功能 gsl::as_bytes gsl::as_writable_bytes 是为了防止 C26710型 针对其他有效的缓冲区访问发出警告。
#include <gsl/span>
void fn1(gsl::span<int, 5> view, byte val) {
    auto bview = as_writable_bytes(view);
    bview[19] = val;  // OK
    bview[20] = val;  // C26710 & C26000
}
  • 修复了规则集的相对路径与规则集目录的确切路径结合使用时发生的规则集加载失败。例如: /analyze:rulesetdirectory f:customRuleset /analyze:ruleset myrules.ruleset
  • 修正了 C6237型 C6285型 if constexpr 表达。
constexpr bool get_condition_a() { return false; }
constexpr bool some_other_check() { return true; }
constexpr void f1() {
    constexpr bool some_condition = get_condition_a();
    if constexpr (some_condition && some_other_check()) {  //Previously issued C6237
        //...
    }
}

constexpr void f2() {
    constexpr int print_debug = false;
    constexpr int headers_debug = false;
    if constexpr (print_debug == true || headers_debug == true) { //Previously issued C6285
        //...
    }
}
struct Test {
    int i{};
};

Test foo() {
    return Test(); //Previously issued C26444
}
  • 修复了源和目标类型相同的强制转换被错误识别为reinterpret cast的问题,这将产生 C26490型 而不是 C26473型 .
struct S{};
void foo(S* s) {
    S* s2 = static_cast<S*>(s); //Previously C26490, now C26473
}
struct S{};
void foo(const S& s) {
    const S* pS = &s;
    S* s2 = const_cast<S*>(pS); //Previously C26465, now C26492
}
  • 修复了的假阳性 C26814型 将于 const 成员变量。
  • 修复了PREFast在检查缓冲区范围时进入无限循环的情况。
  • 固定假阳性 C26815型 将值赋给 std::optional 通过引用传递到函数中的。
  • 固定假阳性 C26816型 从指针向量返回指针时。
  • 固定假阳性 C26485型 当对printf的调用使用由三元运算符选择的字符串文本时出现。

其他更改:

  • 更新了对SARIF格式的支持,以符合版本2.1规范。
  • 添加了对规则集文件的其他规则操作级别的SARIF支持。现在可以将规则操作指定为“无”、“默认”、“信息”、“警告”和“错误”。
  • 远离的 C26443型 –执行 约128 已更改使C26443过时。
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Example For Warning Levels" Description="" ToolsVersion="16.0">
  <IncludeAll Action="Info" />
  <Rules AnalyzerId="Microsoft.Analyzers.NativeCodeAnalysis"
         RuleNamespace="Microsoft.Rules.Native">
    <Rule Id="C6001" Action="Error" />
    <Rule Id="C6011" Action="Warning" />
    <Rule Id="C6101" Action="Info" />
    <Rule Id="C6201" Action="Default" />
    <Rule Id="C6386" Action="None" />
  </Rules>
</RuleSet>
  • 使用C样式的void cast忽略用 [[nodiscard]] 以前发行的 C26493型 敦促开发人员不要使用C风格的强制转换。新规则 C26457型 将在其位置发布,指导开发商将返回值分配给 std::ignore 如果他们打算放弃返回值。
#include <tuple>

struct S{};
[[nodiscard]] S fn1();

void function() {
    (void)fn1(); //Previously C26493, now C26457
    std::ignore = fn1();
}
  • 的文本 C26496型 已从更新 “The variable '%variable%' is assigned only once, mark it as const (con.4)” “The variable '%variable%' does not change after construction, mark it as const (con.4)”.

如前所述,我们所做的工作很大程度上受我们在网站上收到的反馈的影响 开发者社区 再次感谢您的参与。请继续提供反馈,并告诉我们是否有一个检查或规则,您希望看到添加到C++核心检查。

请继续关注更多的C++静态分析博客,我们工作到16.10。即将到来的是关于C++核心检查规则的改进、改进的诊断以及微软/GSL GITHUB项目的更新。与此同时,请不要犹豫,向我们伸出援手。我们可以通过以下评论或 @视觉 在Twitter上。

© 版权声明
THE END
喜欢就支持一下吧,技术咨询可以联系QQ407933975
点赞0 分享