如何确保指向内存地址的指针有效?

时间:2016-06-13 20:58:47

标签: c++

我写了以下函数:

template <typename T> void SetPointer(DWORD64 base, vector<DWORD>Offsets, T value){
base = *reinterpret_cast<DWORD64*>(base);
for (int i = 0; i < Offsets.size() - 1; i++){
    base = *reinterpret_cast<DWORD64*>(base + Offsets[i]);
}
*reinterpret_cast<T*>(base + Offsets[Offsets.size() - 1]) = value;
}

它完美无缺,除了我想要检查以确保地址有效并且它不会导致崩溃,但我还没有找到任何有效的方法要做到这一点。实现这一目标的最佳方式是什么?

编辑: 这就是我需要的技巧:

template <typename T> void SetPointer(DWORD64 base, vector<DWORD>Offsets, T value){
if (base == 0) return;
base = *reinterpret_cast<DWORD64*>(base);
for (int i = 0; i < Offsets.size() - 1; i++){
    base = *reinterpret_cast<DWORD64*>(base + Offsets[i]);
    if (base == Offsets[i] || base == 0) return;
}
*reinterpret_cast<T*>(base + Offsets[Offsets.size() - 1]) = value;
}

1 个答案:

答案 0 :(得分:1)

tl;博士:这是不可能的。

长版: Windows具有名为IsBadXxxPtr的功能,这是着名的Microsoft程序员对它们及其功能所说的话:

IsBadXxxPtr should really be called CrashProgramRandomly