我正在如下分配数组:
__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警告。
我的代码中是否有错误或者是误报?
答案 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); // <<
}
}
请尝试看看!