Skip to content

关于 MSVC 下 _aligned_malloc 未包含 NCNN_MALLOC_OVERREAD 保护区的疑问 #6517

@gengguanwei

Description

@gengguanwei

ncnn 团队你们好,
我在阅读 allocator.h 源码时,发现 fastMalloc 函数在不同平台下的实现存在一处不一致,涉及内存安全填充。

代码位置:
allocator.h Line 56-75

观察到的现象:
对于 POSIX 和 Android 平台,代码显式地在分配大小上增加了 NCNN_MALLOC_OVERREAD (64字节),注释中说明这是为了防止 SIMD 循环中的过度读取(Over-read)导致 SEGV 错误。
然而,在 MSVC 分支 (#if _MSC_VER) 中, _aligned_malloc 仅使用了原始的 size,没有加上 NCNN_MALLOC_OVERREAD。

static NCNN_FORCEINLINE void* fastMalloc(size_t size)
{
#if _MSC_VER
    // 当前实现:没有加 OVERREAD
    return _aligned_malloc(size, NCNN_MALLOC_ALIGN);
#elif ...
    // POSIX 实现:显式加上了 OVERREAD
    if (posix_memalign(&ptr, NCNN_MALLOC_ALIGN, size + NCNN_MALLOC_OVERREAD)) 
#endif

我的疑问:
Windows/MSVC 版本不需要这个保护区是有特殊原因的吗?

是因为 Windows 的堆管理器(Heap Manager)隐式提供的填充足够大,所以不需要显式分配?
还是说这是一个疏忽?如果是疏忽,在 Windows 上运行执行 Over-read 的 AVX/AVX512 核心代码时,是否存在潜在的越界访问风险?
如果这是非预期的行为,建议在 MSVC 分支也加上 + NCNN_MALLOC_OVERREAD 以保持各平台一致性和安全性。

谢谢!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions