パスワードを忘れた? アカウント作成
15589243 story
OS

リーナス・トーバルズ氏、Linuxカーネルの開発を「C89」から「C11」に移行方針へ 76

ストーリー by nagazou
移行 部門より
Linuxカーネルは「C」言語で記述されているのは知られているが、現在使われているのは主に1989年の規格である「C89」であるという。ZDNetによれば、Linus Torvalds氏が、Linuxカーネルの公式な開発言語を2011年規格の「C11」に移行しようとしているそうだ(ZDNet Japan)。

移行判断のきっかけとなったのは、あるカーネルの脆弱性問題にあったという。Torvalds氏がこれを解決するパッチを適用しようとしたとき、該当パッチの問題が判明した。この問題を修正するには「C99」の機能が必要だった。これをきっかけにC89に別れを告げ、この種の問題が起こり得ないCの新規格に移行する方針に決めた模様。
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by annoymouse coward (11178) on 2022年03月07日 13時26分 (#4211008) 日記

    C89からC11だと間に C99があります.

    C99で標準化された機能でカーネルコードに影響がありそうなものは
    - 可変引数マクロ. __VA_ARGS__ 使うやつ
    - designated の初期化. struct A { int hoge; int fuga}; A a = { .hoge = 1, .fuga= 2}; って書けるやつ
    - 可変長配列
    - サイズゼロ配列
    - for (int x=0; x<10; ++x) って感じでローカル変数が宣言できるやつ
    などがあります.

    最後の for文内でローカル変数が宣言できる機能が,今回のC89からC11に移行するきっかけになった新機能です.
    LKMLの議論だと,全部のメールを読んだわけではありませんが流し読みした感じでは
    C89からC99に移行しようと言う話になって,どうせならC11にしたら?って流れになってました.

    ただし上記のC99機能は以前からgccなどたいていのコンパイラでは実装済みになっていて(確か GCC 5.0あたりで実装された)
    例えば,サイズゼロ配列や designated 初期子は既存のlinuxカーネルでも多様利用されています.
    ですから厳密にはC89だけではlinuxカーネルはコンパイルできません.

    次にC11で標準化された機能でカーネルコードで役に立ちそうなのは
    - _Generic キーワード.c++ でいうtemplate関数みたいなtype genericなマクロが書ける
    - stdalign.h .アラインメントを指定する修飾子が使える
    です.

    特に _Genericキーワードはかなり強力で,よりセキュアで実行速度が速いコードが簡単に実装できるようになります.今後の展開が楽しみです.

    • by Anonymous Coward

      まともに追いかけていない門外漢だけど、linuxってgcc固有機能もあちこちで使っている印象だったので
      今でも(建前上は)C89縛りだったんかい!という感じ

      • by Anonymous Coward on 2022年03月07日 14時05分 (#4211038)
        建前上はGNU拡張入りのC89では(gcc -std=gnu89)
        C99の新機能はライブラリの機能ばっかりでカーネルのコード書くときは関係ないよねというのがC89にとどまってた理由
        親コメント
        • by Anonymous Coward

          で、今回ついに-std=gnu89では使えないコア言語の機能(for文内でローカル変数を宣言できる機能)が問題になったと

      • by Anonymous Coward

        なんか以前移行を試みたときはgcc 4.x系のバグを踏んで断念したらしい

    • by Anonymous Coward

      組み込みに使えないコードとか吐き出してこないのかだけ心配

      • by Anonymous Coward

        どういうののこと言ってんの?

      • by Anonymous Coward

        ベンダが対応するだろ多分。i386見たくメインストリームからバッサリ切られるかもしれないけど。

    • by Anonymous Coward

      C99からのジャンルの統合ありますのでご注意を
      え?コミケじゃない?

    • by Anonymous Coward

      GCC拡張のサイズゼロ配列は使ってるとこあるだろうけど、C99のは使ってるとこある?
      同機能別文法のものが使われてるって言いたいのかもしれんが。

    • by Anonymous Coward

      C99からC11の変更点。
      ・VLAがオプションになった。
      不思議。サポートしないコンパイラがあるようには思えないけど。

      しかしなぜC18ではないのか。新しすぎか。

    • by Anonymous Coward

      gccとc99でinlineの仕様が微妙に変わってなかったっけ?
      確かextern inlineとinlineの意味が入れ替わった。

  • by Anonymous Coward on 2022年03月07日 13時20分 (#4211004)

    C++の勉強にかまけて、Cの進化には全然キャッチアップしてなかった俺みたいな奴へ

    > Cといえば、「ファイルスコープでない変数宣言がブロックの先頭になければならない」。
    > Cといえば、「//」は非標準。

    このへんはもう、C99で緩和(標準化)されてるから、もうこれだけでぐっとラクになってるよ!
    C11は、さらにその先。

    • by Anonymous Coward

      自分もこれですね
      //コメントは常用してますが
      先頭以外での宣言はデバッグ用の一時的な書き捨てコードで利用してます(本番コードでは使ってません)

    • by Anonymous Coward

      今後は/* */コメントは非推奨で//コメントで書く必要あり?

      • by Anonymous Coward

        え?C11だと /* */ コメントは非推奨になったの?

      • by Anonymous Coward

        コーディングスタイルの問題として、今後は積極的に新式にしましょう、それで気軽にどんどんコメント入れましょう、って現場はありそう
        複数行なら、従来通り、/* */ のほうがはやいし

        • by Anonymous Coward

          Linux kernel の話では無いが、 Windows で Shift_JIS (CP932) で書いていると
          // の1行コメントの最後にうっかりダメ文字を書いて次の行までコメントになることがある。

  • by Anonymous Coward on 2022年03月07日 13時21分 (#4211006)
  • by Anonymous Coward on 2022年03月07日 13時20分 (#4211003)

    ブロックを加え波括弧で囲めば済む話じゃん
    インデントがウザいとか?

    • by nekopon (1483) on 2022年03月07日 13時29分 (#4211009) 日記
      それをマクロに押し込めたいって意図かと。全部のコードを書き換えるのはかなりのコストなので
      親コメント
    • by Anonymous Crow (45505) on 2022年03月07日 18時07分 (#4211237)

      >ブロックを加え波括弧で囲めば済む話じゃん

      そうすると、波括弧を閉じるのにもう一つマクロが必要で
      構文を変えたくなかったのでC99でってことですかね

      (And by "couldn't", I mean "without making for special syntax": we do
      exactly that in "for_each_thread ()" and friends, but they have an
      "end_for_each_thread()" thing at the end).

      一応、list_for_each_entry()関係は以下が分かりやすいかな?
      https://qiita.com/n01e0/items/95922a475bac458f0b47 [qiita.com]

      親コメント
    • by Anonymous Coward

      必要かといえば、代替の書き方はあるので、必要ない。
      今後も類似の不具合を持ち込まないためには、全てのfor文で同じことやるべきってことだから、その手間が将来常に発生しつづけるコストと、今c99に移行するコスト考えて、移行しちゃったほうがええんちゃうかという話では?
      c99にするのは差分がまだ少ないからということなんだろうけど、テストとかの移行コストかけるのなら、c99と言わずc11/c17とかにしといたほうが先々は良いと思うけど。

    • by Anonymous Coward

      でもやっぱりウザいよね
      バグ避けにfor文は毎度ブロックで囲みましょうなんてコーディングスタイル

  • by Anonymous Coward on 2022年03月07日 13時21分 (#4211005)

    といいつつ自分も把握してるのはC89の範囲…

    • by Anonymous Coward

      次回はC100だったと思います!

  • by Anonymous Coward on 2022年03月07日 13時32分 (#4211012)

    C89 → C99 → C11 って、信じられないネーミング。

    • by Anonymous Coward on 2022年03月07日 13時45分 (#4211021)

      まぁ通称とか俗称であって、正規の名称じゃないから。

      親コメント
    • by Anonymous Coward

      Windows1.0→2.0→3.0→3.1→95→98→2000→ME→XP→Vista→7→8→8.1→10(最終バージョン)→11

      あとは番号と世代が入り乱れてるRyzenとか、一回リセットしたり過去の世代に差し込んだりするGeforceとか、採番って難しいね

      • by Anonymous Coward

        Windows1.0→2.0→3.0→3.1→95→98→2000→ME→XP→Vista→7→8→8.1→10(最終バージョン)→11

        NT「わしもまぜろ」
        CE、Mobile、Phone、RT、Start「ぼくたちも」

        # IoTもToT状態だしなぁ

      • by Anonymous Coward

        10.2→…→13.2→Leap 42.1→…Leap 42.3→Leap 15.0→Leap 15.1→Leap 15.2→

        という謎バージョニングのopenSUSE…

        エンタープライズ版のSLESと同期させるときにSLESのバージョン番号(12.1)そのままだとに13.2からバージョンが戻ったように見えるのでLeapで+30する→やっぱりやめるということのせいですが…

      • by Anonymous Coward

        2000は98の改良じゃないんだし、その後継がMEというのもおかしい。
        Windowsは一子相伝ではない。

        • by Anonymous Coward

          NT2000だったら良かったんだ!

    • by Anonymous Coward

      CA1 よりはマシ…かな?

    • by Anonymous Coward

      インテルのプロセスルール
      Intel 7 → Intel 4 → Intel 3 → Intel 20A

      https://ascii.jp/elem/000/003/236/3236851/img.html [ascii.jp]

      • by Anonymous Coward

        20Aは20オングストロームのことじゃないの?

        • by Anonymous Coward

          マイクロメートル(0.35・0.25・0.18)からナノメートル(90~)も巻き戻りに見えるかも。

    • by Anonymous Coward

      アメリカの軍用機みたいなもんだよ。日本を焼け野原にしたB-29より強いB-2とか。
      オーバーフローしたらリセットする。長ったらしい表記になるよりはマシ。

      • by Ryo.F (3896) on 2022年03月07日 20時46分 (#4211363) 日記

        米軍の場合、B-XXがオーバーフロー下からB-1にしたわけでも無いけどな。命名規則変更に伴いリセットされた。
        一方日本は、オーバーフローでリセットした。ゼロ戦(零式)の前は九六式だし、隼(一式)の前は九七式。

        親コメント
        • by Anonymous Coward

          年号に対してオーバーフローという言い方もなんだかなあと思う

    • by Anonymous Coward

      100の補数になってるところが面白い

    • by Anonymous Coward

      C++もC++97→C++03だったな。
      むしろFortran 2003やCOBOL 2002のほうがY2K対応してるってなんの冗談だよ

    • by Anonymous Coward

      マジレスすると、運用で回避する自信があるからでしょ。もし、2089年に新しい規格ができたら、2088年に完成したことにしておいてC88にするってこと。

  • by Anonymous Coward on 2022年03月07日 16時50分 (#4211181)

    OSには無関係だろうが、浮動小数点演算関係も新しい規格のほうが良くなっててありがたい

    • by Anonymous Coward

      整数の範囲に限定しても、負数の除算の動作が規格で統一された。おかげでdiv関数の存在意義がいまいち謎になってしまったが

typodupeerror

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

読み込み中...