__m256数组上的Visual Studio 2019 C6385 / C6386(缓冲区溢出警告)

时间:2019-08-10 19:46:49

标签: c++ visual-studio compiler-warnings visual-studio-2019

我正在如下分配数组:

__m256 *v256f_valid_mask = (__m256*)malloc(sizeof(__m256) * p_ranks);

编译器在我访问该数组的所有行上都显示警告C6385 / C6386(取决于确切的上下文),除了[0]以外,这表明可能会读取64个字节。该定义明确指出它是一个32字节值的数组。

使用_aligned_malloc()无济于事。

重现警告的示例代码:

void func(const size_t p_ranks)
{
    __m256 v256f_x = _mm256_set1_ps(1.0f);
    __m256* v256f_valid_mask = (__m256*)malloc(sizeof(__m256) * p_ranks);

    for (size_t rank = 1; rank < p_ranks; rank++)
    {
        v256f_valid_mask[rank] = _mm256_cmp_ps(v256f_x, _mm256_setzero_ps(), _CMP_GT_OQ); // <<
    }
}

确切警告:

我通过空检查修复了C6011警告。

我的代码中是否有错误或者是误报?

1 个答案:

答案 0 :(得分:2)

这是一个误报,但是代码分析器不知道(可能是因为它不“信任” malloc()调用)!而是使用“ new”清除警告(至少在我的VS2019解决方案中)……

void func(const size_t p_ranks)
{
    __m256 v256f_x = _mm256_set1_ps(1.0f);
//  __m256* v256f_valid_mask = (__m256*)malloc(sizeof(__m256) * p_ranks);
    #if defined(__cplusplus)
    __m256* v256f_valid_mask = new __m256[p_ranks];
    #else
    #define MAXRANKS 100 // Would probably be defined elsewhere!
    __m256 v256f_valid_mask[MAXRANKS];
    #endif

    for (size_t rank = 1; rank < p_ranks; rank++)
    {
        v256f_valid_mask[rank] = _mm256_cmp_ps(v256f_x, _mm256_setzero_ps(), _CMP_GT_OQ); // <<
    }
}

请尝试看看!