__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 ...你如何使用来自cnew @ta.speot.is:有趣的一点!请参阅使用普通旧 C 的 UGLY 解决方案在代码块中编辑!

以上是关于__m256 数组上的 Visual Studio 2019 C6385 / C6386(缓冲区溢出警告)的主要内容,如果未能解决你的问题,请参考以下文章

002_Visual Studio (gnuplot)显示数组波形

Visual Studio 中的动态链接

visual studio 2012怎么连接mysql数据库

错误 C2536 的解决方法:无法在 Visual Studio 2013 中为数组指定显式初始化程序

将 __m256i 存储为整数

将 __m256i 存储为整数