「ANOMALY: use of REX.w is meaningless」問題の闇は深い

id:eel3:20160909:1473422844 に書いた、コマンドプロンプトで64bitビルドのコンソールアプリを使うと次のようにエラーメッセージが出力される問題:

[0x7FFFB4DF70E3] ANOMALY: use of REX.w is meaningless (default operand size is 64)

ひとまず、

――というところまで推測(というか妄想)している。

この問題、いやらしいことに、コンソールアプリやスクリプトの利用に悪影響を及ぼしたり及ぼさなかったり、微妙に中途半端なのだ。

まあ、常に悪影響を及ぼすとなると、自分自身の作業上は大問題なのだが、そのような場合には私以外にも迷惑を被る人が多いだろうから、トレンドマイクロも対応せざるをえないはずだ。

しかし今回の場合、例えばコマンドプロンプト上でパイプやリダイレクトを使用したり(またはそのようなバッチファイルを実行したり)、PowerShell上で実行したり、Cygwinbash上で実行したりする分には、パイプやリダイレクトで得られる出力に余分なもの(=前述のエラーメッセージ)が紛れ込むことはない。コマンドプロンプトに毎度毎度エラーメッセージが表示されるのがうざいぐらいの被害で済む。

その一方で、Git for WindowsのGit GUIや、CygwinRubyirbのように、エラーメッセージが悪影響を及ぼすケースもある。というか、Git GUIの場合、起動に失敗した際のエラーダイアログの中に件のエラーメッセージが紛れているので、どう考えてもエラーメッセージが悪さをしているとしか思えない。

つい最近分かったのだが、コマンドプロンプトからPowerShellスクリプトを実行して、標準出力の内容をパイプで受け取ったりファイルにリダイレクトしたりすると、エラーメッセージが紛れ込むようだ。

例えばこんなスクリプト

# hello.ps1
Set-StrictMode -Version Latest

"hello, world"

これをPowerShellから実行する分には問題ない。

PS C:\Users\fabrico> .\hello.ps1
hello, world
PS C:\Users\fabrico> .\hello.ps1 > out.txt
PS C:\Users\fabrico> Get-Content .\out.txt
hello, world
PS C:\Users\fabrico> _

しかし、コマンドプロンプトから実行すると:

C:\Users\fabrico>powershell -ExecutionPolicy RemoteSigned -File hello.ps1
[0x7FFB9EAB70E3] ANOMALY: use of REX.w is meaningless (default operand size is 64)
hello, world

C:\Users\fabrico>powershell -ExecutionPolicy RemoteSigned -File hello.ps1 > out.txt

C:\Users\fabrico>type out.txt
hello, world
[0x7FFB9EAB70E3] ANOMALY: use of REX.w is meaningless (default operand size is 64)

C:\Users\fabrico>powershell -Command "\"hello, world\""
[0x7FFB9EAB70E3] ANOMALY: use of REX.w is meaningless (default operand size is 64)
hello, world

C:\Users\fabrico>powershell -Command "\"hello, world\"" > out2.txt
[0x7FFB9EAB70E3] ANOMALY: use of REX.w is meaningless (default operand size is 64)

C:\Users\fabrico>type out2.txt
hello, world
[0x7FFB9EAB70E3] ANOMALY: use of REX.w is meaningless (default operand size is 64)

C:\Users\fabrico> _

リダイレクトした出力先ファイルにエラーメッセージが混入している(typeはcmd.exeの組み込みコマンドなので、実行時にエラーメッセージは表示されない点に注意)。パイプ経由でclipに送り込んだ場合も同じだ。

ところで、前述したように、普通にコマンドプロンプト上でコンソールアプリを実行して出力をパイプやリダイレクトに流し込んだ場合は、その出力にエラーメッセージは混入しない。

つまり、コンソールアプリやスクリプトを実行する際の、標準出力のハンドリング方法か何かが最低でも2種類存在して、そのどちらを使っているかによって、悪影響を受けるか否かが分かれることになる――という風に推測できる。

こうなると、デバッグ(というか問題の影響範囲の調査)は大変になるし、迷惑を被る人が少なくなるからトレンドマイクロの対応も微妙になりかねない。

正直なところ、なぜコマンドプロンプトからPowerShellスクリプトを実行した場合にだけ問題となるのか、いまいち納得できない。本当に、何で?

追記:2016-10-15

何種類かのOSで実験してみた。

OS ウイルスバスター 問題発生の有無
Windows 7 64bit ウイルスバスタークラウド11 問題なし
Windows 10 Home Ver.1511 64bit ウイルスバスタークラウド11 問題なし
Windows 10 Home Ver.1607 64bit ウイルスバスタークラウド11 問題あり

Windows 10でもVer.1511までは問題なし。しかしVer.1607(Anniversary Update)を適用したり、もしくは最初からVer.1607でクリーンインストールしたりすると、この問題が発生するようになる。

実は「Windows 10 Ver.1607 + ウイルスバスタークラウド10」の組み合わせも検証したかったのだが、トレンドマイクロダウンロードサイトから落としたファイル(TTi_10.0_HE_64bit.exe)を使っても、ウイルスバスタークラウド10の頃の体験版インストーラ(TrendMicro-TTi_10.0_HE_Downloader.exe)を使っても、最終的にウイルスバスタークラウド11がインストールされてしまうため、検証しようにも無理だった。

――ということは、ウイルスバスタークラウドの旧バージョンで急場をしのぐことが不可能なのか。支障が出るツールを検証して個別対応するか、他のアンチウイルスソフトを試してみるか……うーん、悩ましい。

追記:2016-11-05

以下のケースでも実害が発生することを確認した。

  • Qtのwindeployqt.exe。
    • QMLを併用しているプロジェクトにて、windeployqt.exeが内部で呼び出しているqmlimportscanner.exeの出力(JSON)に件のエラーメッセージが混入してしまい、誤ったフォーマットになってしまうことで、処理が中断されてしまう。
  • Windows Script Hostのcscriptによるスクリプト
    • 標準出力への出力に件のエラーメッセージが混入してしまう。

windeployqt.exeのケースは、Git for WindowsのGit GUIのケースと同様に、サードパーティのツールの動作に悪影響が出ている一例だ。

cscriptのケースは、PowerShellのケースのように、どちらかと言えば自作スクリプトに悪影響が及ぶ一例だが、PowerShellとは違って回避策が無いのが問題だ。

うーん、早くパッチが出てくれないだろうか。

追記:2016-12-09

どうやら2016-11-30〜2016-12-01あたりに配信されたアップデートにて修正されたようだ。