私は次の関数を書いた:私はアドレスが有効であり、それはクラッシュが発生しないことを確認するチェックをしたいのですがそれ以外それは、完璧に動作しますが、私は持っていないメモリアドレスへのポインタが有効であることを確認する方法はありますか?
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;
}
それは不可能です: Windowsはここに
IsBadXxxPtr
と呼ばれる機能があり、有名なマイクロソフトのプログラマは、彼らとその機能について言いたいことを持っているものです。 – immibisあなたは知る方法がありません(nullptr/0を除いて) – Davidbrcz
しかし、好奇心が強い場合は、特に 'SIGSEGV'を扱うシグナルで遊ぶことができます。しかし、それは標準が無効なポインタを逆参照することについて何も言わないので、それは**未定義の動作です**という悪い習慣です。しかし、それはちょうどWorks *™です。 – PcAF