マイナーなことをAIに聞いても、ろくなことにならないということを痛感しました。
それなりに知見が得られたので、本稿で共有したいと思います。
投機的実行と呼ばれるCPUの最適化処理を悪用して、本来なら読み取ることができないメモリ内のデータを読み取ってしまう「スペクター」と呼ばれる攻撃手法があります。
Spectre 軽減策は、この対策をコンパイラが勝手にやってくれる最適化オプションのことです。
スペクター攻撃(Spectre やスペクターとも言うらしい)は有名なのでAIに聞いても問題ないと思います。
(色んなメディアで取り上げられたらしい)
Visual Studio 2022 の C++ では、以下の手順で有効にすることができます。
1. メニュー>プロジェクト>「プロジェクト名」のプロパティを選択。
2. プロパティページの左ペインで、C/C++>コード生成 を選択。
3. 右ペインの Spectre 軽減策 から「無効」以外を選択。
ビルド(コンパイル)したときに、以下のエラーまたは警告が出ることがあります。
1. MSB8040
2. warning C5045
これは Spectre 軽減策を行うための機能がインストールされていないので、インストールするだけで済みます。
Visual Studio Installer か、メニュー>ツール>ツールと機能を取得 から「個別のコンポーネント」を選択し、以下のコンポーネントを選択します。
MSVC v??? – VS 2022 C++ * Spectre 軽減済みライブラリ(最新)
v??? は MSVC のバージョンによって変わります。25/9/4 時点では v143
* は対象アーキテクチャです。Windows や Linux なら x64/x86 スマホなら ARM64 など…。
ドハマリしたのはこれです。
ワーニングには無視しても問題がないものと、問題があるもの、無視しない方が良いもの…があります。
C5045 は「Spectre 軽減策のコードをここに追加しましたよ。」と報告しているだけなので、無視しても問題ないです。
ただ、アプリの堅牢性を向上させるために、Release ビルドなんかでは、ワーニングをエラーとして扱う設定をすることがあります。
その設定になっている場合は無視できません。
解決法は #pragma warning を使うことです。
既に #pragma warning だらけなので、これを使わない方法がないものかをAIに相談しました。
AIが言うには、intrin.h をインクルードして、__speculation_barrier() 関数を使えば、手動で Spectre 軽減策を仕込むことができるので、#pragma warning は不要になる…と自信満々に断言しました。
試してみたところ、intrin.h は問題ないんですが、__speculation_barrier() 関数がまったく有効になりません。
色々と相談して、AIが提案する方法を全て試したのですが、一考に関数を使えるようになりません。
仕方がないので、この方法はどこに記載されているものなのか、ソースを提示するよう要求しました。
AIが提示したリンク先は全て404でした…。
「あー、いつものやつね…(学習した情報が古いまま)」
環境やアーキテクチャによってやり方は変わるのかも知れませんが、少なくとも Visual Studio 2022 の最新バージョンで x64 (Windows) コンソールアプリの場合、やれることは #pragma warning だけのようです。
※使用したモデルは Gemini 2.5 Pro です。
AIは信用できないから使わない方が良い…と言っているわけではありません。
それを、よく、よく、よーく、理解した上で、積極的に使うべきです。
上手に使えば、確実に効率は上がります。
ネットに情報がありふれているものに関しては、AIはとても上手に働いてくれます。
ただ、アプリの最新バージョン、APIの最新バージョン、そもそも、誰も気にしないようなマイナーな分野については、全くあてにならないです。
AIが使い物になるかどうかは、ネットの情報量に依存しています。
また、AIは入力に対して、毎回微妙に違う結果を返します。
非決定論的に動作する仕組みなので、これはどうしようもないです。
そのため、結果が変わると困るもの…高い精度が求められるようなものや、センシティブなものに対しては使えません。
やるとしたら、めんどくさい仕組みが必要になりそう…。