我读了很多书,包括这里的 SO,这表明这通常是一个非常糟糕的主意,你唯一可以安全地做的就是退出程序。我不确定这是不是真的。
这是用于将大量分配交给 malloc 的池化内存分配器。在 pool_free() 期间,需要检查指针是否属于池或使用 malloc 分配。通过将地址向下舍入到最近的 1MB 边界,我得到了一个指向池中内存块开头的指针,或者如果使用了 malloc,则为 undefined。在第一种情况下,我可以轻松地验证内存块是否属于池,但是,如果不是,我将无法通过此验证,或者我将遇到访问冲突(请注意,这是一个只读进程)。我不能用 SEH (Windows) 捕捉到这一点或处理信号 (POSIX) 并简单地将其视为失败的验证吗?(即只有在使用 malloc 时才有可能,因此将 ptr 传递给 free())
编辑:人们似乎缺少上面的 OR。如果指针是用 malloc 分配的,我不希望出现访问冲突,但这是一种可能的结果。使用指向块开头(在 1MB 边界处)的指针的过程是验证幻数,然后跟随指向内存池的指针,并检查它是否确实包含上述指向块的指针。如果这些只读步骤中的任何一个产生访问冲突,它肯定会失败验证,就像任何单个步骤失败一样。