SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

伏石ちゃんは意図に反したい

脆弱性の原因にも? 整数オーバーフローの仕組みを見てみよう【伏石ちゃんは意図に反したい】

FILE 0x04 整数オーバーフロー


ダウンロード sample.zip (727.0 B)

実際に試してみよう

ふうん、先生にだいたい聞いたんだ
充希
実際に試してみたいんだけど……
得意なプログラミング言語は?
充希
C#なら、なんとか
なんでまたそんな古典言語※を

※この作品は2070年という設定です

充希
唯一あんまりコンパイラーがバグらないというか……
はいはい

 Visual StudioなどでC#コンソールアプリを作成し、以下のコードを実行してましょう。

using System;

namespace sample
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 2147483647;
            i = i + 1;
            Console.WriteLine(i);        
        }
    }
}

 コンソールには以下の結果が出力されるはずです。

-2147483648
充希
本当だ、マイナスになった
じゃあ、これが符号なし整数だったら……

 次は、intuintに書き換えて実行してみましょう。

using System;

namespace sample
{
    class Program
    {
        static void Main(string[] args)
        {
            uint i = 2147483647;
            i = i + 1;
            Console.WriteLine(i);        
        }
    }
}

 すると、コンソールの出力は以下のようになります。

2147483648
充希
今度はマイナスにならない
符号なし整数だからね
充希
じゃあ、符号なし整数が最大値+1になったらどうなるの?
自分で試してみたら?
充希
……はい

 では、2147483647の代わりに、符号なし32ビット整数の最大値4294967295を使用します。

using System;

namespace sample
{
    class Program
    {
        static void Main(string[] args)
        {
            uint i = 4294967295;
            i = i + 1;
            Console.WriteLine(i);        
        }
    }
}

 すると、コンソールの出力は以下のようになります。

0
充希
あ、ゼロになった
充希
じゃあ、引き算するとどうなるんだろう
using System;

namespace sample
{
    class Program
    {
        static void Main(string[] args)
        {
            uint i = 0;
            i = i - 1;
            Console.WriteLine(i);        
        }
    }
}

 コンソールの出力は以下のようになりました。

4294967295
充希
おお! 最大値になった。すごい!
……こんなことで感動できるなんて羨ましい
充希
えぇ……
ま、これで完全に理解したでしょ。じゃあね
充希
ちょっと待って
まだ何かあるの?
充希
手押しの数取器で0000が逆回転したら9999になるのは分かるけど、コンピューターの引き算でこういうことが起きる仕組みが分からないというか

次のページ
減算と2の補数表現

この記事は参考になりましたか?

伏石ちゃんは意図に反したい連載記事一覧

もっと読む

この記事の著者

井二 かける(イブタ カケル)

 情報処理安全確保支援士、プログラマー、作家。「物語の力でIT・セキュリティをもっと面白く」をモットーに、作家活動、セキュリティ啓発活動を行う。主な作品はアニメ「こうしす!」、小説「こうしす!社内SE祝園アカネの情報セキュリティ事件簿」(翔泳社)、マンガ「伏石ちゃんは意図に反したい ~ハッキングから始まる高校生活~」(京姫鉄道出版)など。 Twitter:@k_ibuta@kyoki_railway

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山口 しずか(ヤマグチ シズカ)

 やりたいことはなんでもやる精神で急成長中の漫画家。2019年よりマンガアプリにて商業連載デビュー。連載の傍ら企業のPR漫画や漫画動画など媒体・ジャンルにとらわれず時代に合わせた漫画を制作中。趣味はお酒と旅行。 Twitter:@shizuckey

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/15055 2021/10/25 11:33

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー