-
Notifications
You must be signed in to change notification settings - Fork 4.4k
Open
Description
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 以保持各平台一致性和安全性。
谢谢!
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels