如何处理核心指南检查器关于 gsl::at 的静态分析警告?
How to handle static analysis warning from Core Guidelines checker about gsl::at?
我在 Visual Studio 中为我的项目激活了静态分析。核心指南检查器说我应该使用 gsl::at 进行订阅。但是我的代码是保存的。摆脱此警告的最干净的方法是什么?我应该禁用它吗?我应该以不同的方式编写代码吗?我应该使用 gsl::at 引入检查开销吗?我的代码是:
template <typename T, size_t N>
void increase(T(&data)[N])
{
for (size_t i = 0; i < N; ++i)
data[i] +=1;
}
我自己找到了解决办法。因为大小在编译时已知,所以可以使用 std::array、std::get 和 std::index_sequence。如果索引越界,std::get 会导致编译错误。不再需要运行时检查。
template <typename... Ts>
constexpr void noop(Ts...) noexcept {}
template <typename T, size_t N, size_t... I>
constexpr void increase(std::array<T, N>& data, std::index_sequence<I...>) noexcept
{
noop((std::get<I>(data) += 1)...);
}
template <typename T, size_t N>
constexpr void increase(std::array<T, N>& data) noexcept
{
increase(data, std::make_index_sequence<N>{});
}
我在 Visual Studio 中为我的项目激活了静态分析。核心指南检查器说我应该使用 gsl::at 进行订阅。但是我的代码是保存的。摆脱此警告的最干净的方法是什么?我应该禁用它吗?我应该以不同的方式编写代码吗?我应该使用 gsl::at 引入检查开销吗?我的代码是:
template <typename T, size_t N>
void increase(T(&data)[N])
{
for (size_t i = 0; i < N; ++i)
data[i] +=1;
}
我自己找到了解决办法。因为大小在编译时已知,所以可以使用 std::array、std::get 和 std::index_sequence。如果索引越界,std::get 会导致编译错误。不再需要运行时检查。
template <typename... Ts>
constexpr void noop(Ts...) noexcept {}
template <typename T, size_t N, size_t... I>
constexpr void increase(std::array<T, N>& data, std::index_sequence<I...>) noexcept
{
noop((std::get<I>(data) += 1)...);
}
template <typename T, size_t N>
constexpr void increase(std::array<T, N>& data) noexcept
{
increase(data, std::make_index_sequence<N>{});
}