Visual Studio __m256 阵列上的 2019 C6385 / C6386(缓冲区溢出警告)
Visual Studio 2019 C6385 / C6386 (buffer overrun warning) on __m256 array
我正在分配一个数组如下:
__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 警告。
我的代码有错误还是误报?
这是误报,但代码分析器不知道(可能是因为它没有 'trust' 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); // <<
}
}
请试看!
我正在分配一个数组如下:
__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 警告。
我的代码有错误还是误报?
这是误报,但代码分析器不知道(可能是因为它没有 'trust' 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); // <<
}
}
请试看!