先日のブログエントリーで、筆者のソフトがWindowsDefenderによるマルウェアと勝手に決められて問答無用で削除された話をしたが、その時編集中のファイルも破壊されたと書いた。その時はそう思っていたが、とりあえずインターネットエクスプローラーのモジュールからWebアクセスしなければ消されないようなので、その代替モジュールであるWebView2でアクセスするようにして、ファイルが破壊される原因を調べたら、最終的にVisualStudioのコード生成がおかしかったのだと分かった。
WebView2でWebアクセスしたら削除されなくなったのだが、編集中のファイルは依然おかしくなるから本当にウイルス感染しているものかと最初疑ったが、そもそもVisualStudioでビルドしたての実行ファイルがおかしくなるのはやはり自分の書いたコードにバグがあるのだろうと言う疑いの下、デバッガーで細かく追跡してたのが、デバッグバージョンだと不具合が起こらない。リリースバージョンだけおかしくなる事を突き止めた。
そこで、リリースバージョンでおかしくなる部分らしき部分のソースコードに、いくつも値がおかしくなる編集情報の値を別ファイルに書き込むようにして値がおかしな値に変化する所を突き止めた。もうVisualStudioのデバッガで、指定した変数の値が変わったらブレークするなんて芸当はできないのだ。
しかし、変な値に変わっている部分を突き止めても、その元となる変数がおかしくさせている部分があるはずだと上記の方法で全部洗ってみたが、全くおかしなところは無く、結局値が変な値に変わっている部分だけおかしくなっている。(問題のコードは条件判断文だ)
正直これは最初信じられなかった。値をチェックするためのファイルに書き出すコードは、問題であるおかしな値になるコードそのものをコピー&ペーストしたものを利用したもので、違いはないからだ。
だから、やることは全く同じで、ソースコードを若干変更して試したら、なんとうまくいったのだ。
具体的には、クラスオブジェクトの配列変数の中の1つの要素(DWORD値 4バイト符号なし変数)へのアクセスを、配列の記号([])を使わず、新たに設けたポインタ変数からアクセスしただけだ。要するに記述方法を変えただけなのだ。(ポインタ変数は記述が長ったらしくなるからあんまり使いたくない。値を不用意に変えてしまうのもあるけど)
問題のコードは、値を代入するのではなく、条件判断を意味するif文1つだけだ。
正直、愕然とした。今月はMicrosoftに攻撃されてばかりだ。そしてWindowsやVisualStudioを使った情報システムに思いもよらない重大な不具合が今後起きると思った。結果、その点においてもMicrosoftは凋落していくのだろうと…。今年金融機関で目立ったシステムトラブルはWindowsアプリのせいだったのだろうか?
多分C/C++コンパイラのプログラムの実行速度を上げる最適化のコード生成に問題があるのだろうが、こんな基本的な事もおろそかにしているのでは安心してプログラムを作れない。最近のC++規格に合わせて矢継ぎ早にバージョンアップしていった弊害だろう。
もう最適化処理はほどほどにして安全性を最重要視してもらいたいものだ。Cコンパイラが出始めたころに比べてCPUは格段に速くなっているのだし。
MicrosoftはWindowsのソースコードを提供しないし、WindowsDefenderがなぜ勝手にファイルを消したかの具体的な理由を提示しないし、独断と独裁性がさらに高まっている。これはシステム管理者としてはWindowsを敬遠することになる大きな理由になりうる。加えてコード生成にも安心できないなら尚更だ。
まったく、自分の誕生日にこんな愕然としてしまうとは。VisualStudioとは英語版VisualC++1.0の時代から30年以上の付き合いだが、こんな信じられない現象に出会ったのは初めてだ。Microsoftのコンパイラはちょっと言語チェックが甘いなという印象は前から思っていたが、これはコンパイル時の話だ。今回の話は実行時の問題。佳子様もいつのまにか30近くになってるじゃないか。生まれた時の報道なんてつい昨日のように覚えている。
VisualStudioをバージョンアップしなきゃよかった。最近のソフトはバージョンアップすると重大な問題も加えてくるので勝手にファイル更新して欲しくない。Windowsはいつの間にかオンラインソフトのバージョンアップ阻止ツールを突破して勝手に最新版をインストールしてきたし、今ではWindowsユーザーは完全に監獄化されている。
やはりフリーUNIXに移行せざるを得ない。30年前も同じように悪戦苦闘してたが今でも全く変わらない。もうMicrosoftに時間を食われたくない。
2023年12月29日
VisualStudioは単純なコード生成も間違えるようになってしまったのか…
posted by danpei at 16:07| software