• 異世界ファンタジー
  • ラブコメ

Windows障害、一夜明けても混乱治まらず

 今朝、角川のネタを出しましたが……あれ、元記事は昨日朝にざーっと書いたものだったんですよね。要点は下部にくっつけた自著宣伝をやるにあたってネタとして書いた……のですが。
 昨日あまりに巨大な障害が発生したので、ちょっと時機を逸しましたね。
 間抜けですが。
 あ、ちなみに昨日アップしたWindowsの記事はネットで拾った対処方法をばらまいておこうと思ってやっただけです。カクヨム上でやってる人は(あの時点では)見当たらなかったので。
 でもせっかく書いたから公開したかったので今朝出したわけですが、今度はちゃんとタイムリーな記事です(多分)

 Windows障害の混乱。
 一夜明けても収束する気配がないですね……まあ仕方ないですが。
 一応復旧手順は出てますが、そもそも普通に使ってたらまたなる可能性だってあるでしょう。
 というかなってるんじゃないかな?

 とりあえず、やはりというか、バグではあるようですね。
 サイバー攻撃とかではない、とCrowdStrike社が宣言してるようです。
 おそらくOSの基幹部分のメモリを、うっかり上書きするようなエラーがあったんでしょうかね。あるいはあり得ない命令を出してしまうようになっていたか。
 いずれにせよ、全く意図せずにでしょう。

 昔いた会社で同じようなのがありました。
 普通にプログラムが動いてると、突然停止する。
 デバッグでやっててもなぜそこで落ちるか全くわからなかったそうです。

 で、頼まれて調べたら……。
 意図せずメモリを上書きしてたからだったんです。
 ただ、そのメモリの上書きしている場所は、全く違うんですよね。
 だからデバッガでもまず分からない。
 当時私もよく見つけたものだと思いました。
 デバッガで分からなかったから、ソースレビューを延々とやったんですが。
 なお、めっちゃ上司に感謝されました。

 ちなみに、やらかしていたのはこんな感じ(C言語分かる人向け)

 char *a;
 char b[4] = "abcd";
 a = (char*)malloc(sizeof(char));
 memcpy(a, b, sizeof(a));

 C言語分かる人なら、やらかしに気づくでしょうか(w

 もっとも、今時のプログラムって、昔のC言語みたいにメモリを明示的に確保、解放するなんてことはしてないと思うんですが……。
 でもセキュリティソフトだと、なんかやっていそうではありますよね。
 組み込みのアセンブラとか普通にありそうだし。
 いずれにせよ、復旧……っていうか、修正パッチはすぐ配るとしても、起動できない問題は各自自分で昨日書いたような方法でやるしかないんですよねぇ。
 いや、マジで色々終わってる。
 普通にこの会社、倒産しかねない気がする……。

[追記]
 そういえば、この予期せぬメモリ上書き。
 これと同系統で有名なバグが、FC版ドラクエ4にあるんですよね。

 あのゲーム、逃げた回数をカウントしてて、8回目には必ず逃げられるという救済措置があったらしいのです。
 ところが。
 ボス戦だけは当然ですが逃げられない。
 そうすると、8回目をカウントしてしまう。
 で、コンピューターに詳しい方はご存じでしょうが、当時はビットレベルでメモリを削って処理してたのですが、この逃げる回数は絶対上限が8回だから、7回目までしか記録不要なため、4ビットしか割り当てられておらず。
 4ビットで記録できる数字は、0~7まで。
 ボス戦で8回目逃げると、その隣のビットを潰してしまうんです。
 んで。
 なんとここに、デバッグ専用の『攻撃が必ず会心の一撃になる』フラグが設定されていたらしく。
 故に、あのゲームはボス戦で8回逃げると、以後必ずすべての攻撃が会心の一撃になるというバグがあったんですよね(笑)


 さて。記事は終わりですが、宣伝は当面載せることにしたので宣伝です。

 〇転移直後に竜殺し
 https://kakuyomu.jp/works/16817330660905115993
 知らない人ほぼいない気はしますが、私が書いた中では一番人気。
 大学生になる直前の青年が異世界転移して剣と魔法の世界を冒険するお話です。
 ……嘘は言ってない、うん(笑)
 基本、二日に一回、0時更新。
 今日も更新しました。

 〇白雪姫の家族
 https://kakuyomu.jp/works/16817330656060480073
 超スローペースで進む年の差ジレジレ恋愛モノ。
 なお、時間進行それ自体は遅いわけではなく、すでに開始から二年半経過。
 高校一年生だったヒロインも今や大学生になってます。
 でもまだくっついていません(笑)
 基本、今は四日に一回更新。
 次の更新は明日の0時、つまり今日の夜です。

画像は さいとう みさき 様が描いてくださったエルフィナ。
食事満喫中。
……さて、テーブルの上のパフェは何個目でしょうかね(笑)

10件のコメント

  • char *a;
    char b[4] = "abcd";
    a = malloc(sizeof(char));
    memcpy(a, b, sizeof(a));

    C言語なんて配列とポインタで挫折するのが普通であり正常!・・・と言いたいのですが、頑張って解読してみます。(やれと言われてしまった気がする)

    1行目でポインタ変数aを宣言。(1文字確保用のchar型)
    2行目で4文字分の配列bを宣言し、その配列に4文字の文字列"abcd"を代入。

    3行目でポインタ変数aのメモリを確保。確保量は sizeof(char)なので1文字分。

    4行目で、配列bのメモリ領域をaにコピー。
    しかし、この4行目のsizeof(a)は3行目のsizeof(char)分、つまり1文字分しか確保されてないので、4文字情報の配列bに対してはメモリ領域が足りない。(その結果何が起こるかは不明)

    プログラマーの意図としては、4行目のbは配列のbではなくて、"abcd"の2文字目ってつもりだったのかもしれないけど、そうは読んでもらえない・・・ってことですかね。ひょっとしたら、bがポインタ型じゃないことも影響するかもしれませんが、ポインタなんてわからないので正常なので(以下略)。

    素人が適当に読んだだけですので、間違ってたら優しく教えてやって下さい。m(_ _)m
  • > 杜若狐雨 様
    すごい。
    仕事でやってたらポインタと配列分からなかったら仕事辞めろ、コースなんですが、趣味の範囲で理解できる人はあまりいなくて、逆に誰もが絶対に一度は引っかかる挫折ポイントです。
    一度分かるとむしろ配列だろうが構造体だろうが何だろうがポインタにしか見えなくなるのですが(実際なった)

    で、それはともかく、結論から言うと間違ってる箇所は正解です!
    素晴らしい。
    変数aはポインタなので、sizeof(a)とすると、それはポインタの数値、つまりint型の長さ(通常4バイト)になるので、想定外に書き込みを行ってしまいます。
    プログラマの意図は、最初の一文字『a』だけをポインタaが示す領域にコピーする感じですね。
    まさにポインタと配列の悪夢が生み出すものですね(^^ゞ
    しかしこれ、文字列が同じ"abcd"なのが例文良くないか。

    この場合、正解は
    memcpy(b, a, sizeof(char));
    ですね。
    C言語の動的メモリの場合、その確保した領域長を記録してることはしてないので、C#みたいに、a.Lengthとかでは取得できないので、覚えておくしかないんですよね。
  • うむ・・・わからん!(爆)

    といっては身も蓋もありませんね。解説ありがとうございます。

    > プログラマの意図は、最初の一文字『a』だけをポインタaが示す領域にコピーする感じですね。

    納得。そういうプログラムでしたか。領域長を常にプログラマー側で把握管理してないと誤作動するとか・・・地獄ですね。(まあ、だから学習者のほとんどはこの辺で頓挫するのだと思う)

    お手を煩わせてしまい、すみませんでした。m(_ _)m
  • > 杜若狐雨 様
    今時じゃないのは間違いなく……わかるだけでもすごいと思います。

    なので基本、割り当てた領域長そのものも変数として押さえておくか、いっそ構造体にしてセットにしておくとか色々あるわけですが……。
    まあこの辺りって、昔の『使えるメモリが限られていた』時代の者ですからねぇ。今の何十ギガバイトとかいうたわけたメモリが使える時代では、過去の遺物です(。。)

    煩わせたなんてとんでもない。
    楽しかったです(w
  • 意図せずメモリを上書き……ありがちなバグですね〜
    新人研修で作らせるプログラムで結構見かけるミスですね(^_^;)

    まあ、慣れたらやらかさないし、通常はレビューで発見して改善出来きるレベルかな。
    でも、レビューで見逃すと、ハマるかも(^_^;)
  • > あきこ 様
    お詳しい!
    実際はもっと複雑なプログラムの中でしたが、これ、結構ハマるんでしょうね。あと、運次第で障害起きませんしねぇ。
    宣言部と処理の部分が別れていると、ついポインタであるのを失念してしまうんでしょう。
    sizeofを使う時は気を付けないとです。
    もっとも、今時はまず起きないバグですが……今回のは果たしてどうだったのか。
  • あーなるほど。
    入れるデーターと領域指定が問題だったと。
    アセンブラなんかだとメモリ指定してるからデーター入れるから、大きさ間違いしないですよね。
    c言語ってやっぱり自由度高いですね〜。
    直接z80いじってたんで、c言語まで手出ししなかったんですよね。
    うーん他の言語もやっておけばよかった。
  • > さいとう みさき 様
    C言語はメモリ確保は明示的に行うのですが、場所を指定しないですからね。なので、領域の範囲指定間違えるとあり得ない挙動をしてしまうという問題はよくありました。
    しかしZ80とはまた懐かしい。アセンブラなさってたので?
    私は当時はアセンブラは分からなかったですね……就職後にコンパイラ作る仕事になって、多少勉強した程度。
    ホントに凄いです。
  • 和泉将樹@猫部 様

    C言語、私の時代は流行ってましたね~++とか。
    でも、現場の機械いじりメインだとみんなアセンブラやってましたね~。
    客先で未だに納品した機械がPC98で動いていて、壊れたから直してくれと言われても流石にもう……
    そもそも誰が作ったか分からないプログラムを探せってのが無理で、動いているプログラムを逆コンパイルしてみてもちんぷんかんぷん。
    プログラム部隊に回して解析してもらうと、ベーシックで作っているとか?
    マジか??
    あと、RS232Cのコネクタを今更どうしろと?
    USB変換キットも、もうないってば~💦

    Z80系は2000年代序盤まで使ってましたので、仕事でもいじりました。
    タイマーとか、警告音出すの使ったなぁ~。

    その後シーケンサーがどんどん良くなって、ラダー図でプログラムと言うか、操作が出来るようになったのでアセンブラも使わなくなりましたが。
    今じゃシーケンサーでいろいろできすぎて、タッチパネル化も出来るようになったのでもの凄く便利です。

    メインシステムとか送信されるデーター集計なんかはやはりプログラム部隊がCとか使ってやってますが、エクセルとか優秀なんで集計はそれ使ったりしてますね~(笑)。
    なにせ、お客の予算があれじゃぁ。

    私の場合、何でも屋をやらされてたので溶接から基板修理、旋盤ボール盤、フライス(NC含む)とか、果てはフォークリフトでリアル倉庫番や交通事故で戦力外の時は事務で年賀状作りとか(笑)。
    ある程度広く浅くいろいろやらされてます(笑)。

    先日は新たに立ち上げた農産課で、初トラクターで畑を掻き回してきました。
    あれ、意外と面白い。
    でも頑張ったのに今年の春先暑くなりすぎて枝豆が半分くらい死滅は堪えましたねぇ~。
    せっかくブームと言う農薬散布の機械も動かせるようになったのに。

    そんなお仕事の私です(笑)。
  • > さいとう みさき 様
    いや、まだPC98が動いている事実がびっくりなんですけど(・・)
    耐用限界とっくに超えてませんか……
    Basicプログラムは、実は恐ろしいことに一度仕事でやったことが。
    学生の頃は便利だと思ってったのですが、あれほど使いにくい言語はないと思いましたね、ホント。
    あ、ちなみにハンドスキャナの組込用言語でした。誰だBasic組み込んだアホは、と思ったものです。
    しかしRS232Cとは懐かしい……というか完全に前世紀の遺物レベルでは……。

    Z80はあまりに優秀+安価なので、結構長く炊飯器とかの家電にも使われたとは聞いてます。が、私は基本ソフトウェアエンジニアで、コンパイルやってた時期以外は組込系はやってないからアセンブラはほぼ門外漢でした。
    つか、さいとう様がやってこられた仕事、一部分からないレベルですよ。すご……っていうか仕事の幅が広い!
    私は徹頭徹尾デスクワークしかやってきてないですね……。
    今はメイン役職はSEですらなく、内部監査+法務+ちょっとSE的な……私もわけわかりませんが(笑)
コメントの投稿にはユーザー登録(無料)が必要です。もしくは、ログイン
投稿する