C++で整数のオーバーフローを検出・チェックする方法
C++において、整数のオーバーフローに対して唯一安全な対策は、オーバーフローが発生する前にチェックを行うことです。ただし、いくつかのテクニック的な方法を使えば、オーバーフローの発生を検出することも可能です。
符号なし整数の加算におけるオーバーフロー検出
例えば、符号なし整数(unsigned int)同士の加算でオーバーフローが起きたかどうかを調べたい場合、「計算結果が加算前のどちらか一方の値より小さくなっていないか」を確認する方法があります。
コード例
unsigned int x, y; unsigned int value = x + y; bool overflow = value < x; // 「value < y」としても同じ結果になる
この方法が機能する理由は次のとおりです。x と y がどちらも符号なし整数である場合、加算によってオーバーフローが発生すると、値はラップアラウンド(桁あふれによる巻き戻り)を起こします。巻き戻った後の結果が元の値より大きくなるためには、符号なし整数が表現できる最大値を超えてさらに進む必要があるため、結果は必ず元のどちらかの値より小さくなります。つまり value < x が true になれば、オーバーフローが発生したと判断できるのです。
CPUのオーバーフローフラグを利用する方法
もうひとつのアプローチとして、CPUが持っているオーバーフローフラグ(Overflow Flag)に直接アクセスする方法があります。一部のコンパイラではこのフラグへアクセスする機能が提供されており、それを利用してオーバーフローの発生をテストできます。
ただし、この手法は標準規格に含まれていないため、コンパイラやプラットフォームに依存します。移植性を重視するコードでは、事前にオーバーフローをチェックする方法(例えば、加算前に最大値との比較を行うなど)を採用するのが安全です。
-
C++で二分木の子ノード合計プロパティを検証する方法
二分木が与えられたとき、次のプロパティ(性質)を満たしていれば、その二分木は有効とみなされます。各ノードのデータ値は、左の子ノードと右の子ノードの値の合計と一致していなければなりません。どちらかの側に子ノードが存在しない場合は、その値は0として扱われます。例えば、以下のような木が与えられた場合、このプロパティを満たしていることになります。この性質を確認するための特別なトリックは存在せず、木を再帰的に走査する必要があります。ノードとその両方の子がプロパティを満たしていればtrueを返し、そうでなければfalseを返します。アルゴリズムの流れ検証は以下の手順で行われます。ノードがNULL、または葉
-
Microsoft公式ツール「SigCheck」で危険な証明書・未署名の証明書をチェックする方法
SuperFishやeDellRootという言葉を覚えている方もいるかもしれません。これらは、ユーザーの知らないうちにPCへインストールされていた危険なルート証明書です。多くのマルウェア対策ツールは不正な証明書の検出と削除に対応していますが、RCC Root Certificate Scannerのように、Windows PCから危険なルート証明書の除去に特化したツールも存在します。MicrosoftのSysInternals SigCheckもそのひとつで、危険な証明書や未署名の証明書をスキャンして確認できるだけでなく、最新版ではフォルダー内のすべてのファイルをVirusTotalでスキャン