__m256 数组上的 Visual Studio 2019 C6385 / C6386(缓冲区溢出警告)
Posted
技术标签:
【中文标题】__m256 数组上的 Visual Studio 2019 C6385 / C6386(缓冲区溢出警告)【英文标题】:Visual Studio 2019 C6385 / C6386 (buffer overrun warning) on __m256 array 【发布时间】:2019-08-10 19:46:49 【问题描述】:我分配一个数组如下:
__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 警告。
我的代码有错误还是误报?
【问题讨论】:
如果您提供了诊断的全文将会有所帮助。因为您只能从熟悉错误代码或遇到麻烦的人那里得到答案 (docs.microsoft.com/en-us/visualstudio/code-quality/…)。 不可能使用“重现警告的示例代码”“重现警告”,因为它不完整并且包含对我们不可用的符号的引用。这只是生成警告的代码 - 这不是一回事,而且几乎没有那么有用。 @Clifford,我已将代码编辑为仅包含有问题的行。它现在应该重现警告。p_ranks
是什么类型,它的值是多少?
不是编译错误,只是代码分析警告。如果语句实际复制了 64 个字节,它将是有效的,但当然不是。很简单的错误。使用帮助 > 发送反馈 > 报告错误来告诉他们。并禁用警告以继续。使用 [visual-c++] 标签来避免此类 cmets。
【参考方案1】:
这是一个误报,但代码分析器不知道它(可能是因为它不“信任” malloc() 调用)!使用“新”来清除警告(至少在我的 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); // <<
请试试看!
【讨论】:
问题被标记为c
...你如何使用来自c
的new
?
@ta.speot.is:有趣的一点!请参阅使用普通旧 C 的 UGLY 解决方案在代码块中编辑!以上是关于__m256 数组上的 Visual Studio 2019 C6385 / C6386(缓冲区溢出警告)的主要内容,如果未能解决你的问题,请参考以下文章
002_Visual Studio (gnuplot)显示数组波形
visual studio 2012怎么连接mysql数据库