日本語版
最新ニュース
科学&テクノロジー

いくつかの__nostring__乱流 [LWN.net]

lwn.netへようこそ 次のサブスクリプションのみのコンテンツがLWNサブスクライバーによって利用可能になりました。何千人もの加入者がLINUXおよびフリーソフトウェアコミュニティからの最高のニュースについてLWNに依存しています。この記事を楽しんでいる場合は、考慮してください LWNへの購読。 lwn.netにアクセスしていただきありがとうございます! による ジョナサン・コーベット2025年4月24日 新しいコンパイラリリースは、多くの場合、新しい警告をもたらします。これらの警告は通常、開発者が厄介なバグに変わる前に問題を見つけるのを助けるためです。ただし、新しい警告に適応することは、特に不幸な時期に重要な開発者が新しいコンパイラにアップグレードする場合、開発プロセスに混乱を引き起こす可能性もあります。これは、 6.15-RC3カーネルリリース の実装 - 解釈された弦の開始化 GCC 15で。 次のようなc宣言を考えてみましょう。 char foo[8] = "bar"; 配列は、文字列の端を示す通常の末尾のnulバイトを含む、指定された文字列で初期化されます。次に、このバリアントを考えてみましょう。 char foo[8] = "NUL-free"; これは、宣言された配列にはNul Byteの部屋が欠けているにもかかわらず、法的宣言です。そのバイトは単に省略され、未終端の文字列を作成します。それは多くの場合、そのコードを書いた開発者が望んでいるものではなく、後で発見されない不快なバグにつながる可能性があります。 - 解釈された弦の開始化 オプションは、この種の初期化の警告を発し、結果として、問題がある場合は問題がある場合、すぐに修正されます。 カーネルコミュニティは、この警告を利用し、うまくいけばバグの原因を排除するために働いてきました。ただし、新しい警告にはわずかな問題が1つしかありません。時には、NO-NULの初期化がまさに必要で意図されていることがあります。たとえば、 この宣言 から fs/cachefiles/key.c: static const char cachefiles_charmap[64] = "0123456789"…

1745571814
2025-04-25 06:46:00

lwn.netへようこそ

次のサブスクリプションのみのコンテンツがLWNサブスクライバーによって利用可能になりました。何千人もの加入者がLINUXおよびフリーソフトウェアコミュニティからの最高のニュースについてLWNに依存しています。この記事を楽しんでいる場合は、考慮してください LWNへの購読。 lwn.netにアクセスしていただきありがとうございます!

による ジョナサン・コーベット
2025年4月24日

新しいコンパイラリリースは、多くの場合、新しい警告をもたらします。これらの警告は通常、開発者が厄介なバグに変わる前に問題を見つけるのを助けるためです。ただし、新しい警告に適応することは、特に不幸な時期に重要な開発者が新しいコンパイラにアップグレードする場合、開発プロセスに混乱を引き起こす可能性もあります。これは、 6.15-RC3カーネルリリース の実装
- 解釈された弦の開始化 GCC 15で。

次のようなc宣言を考えてみましょう。

    char foo[8] = "bar";

配列は、文字列の端を示す通常の末尾のnulバイトを含む、指定された文字列で初期化されます。次に、このバリアントを考えてみましょう。

    char foo[8] = "NUL-free";

これは、宣言された配列にはNul Byteの部屋が欠けているにもかかわらず、法的宣言です。そのバイトは単に省略され、未終端の文字列を作成します。それは多くの場合、そのコードを書いた開発者が望んでいるものではなく、後で発見されない不快なバグにつながる可能性があります。 - 解釈された弦の開始化
オプションは、この種の初期化の警告を発し、結果として、問題がある場合は問題がある場合、すぐに修正されます。

カーネルコミュニティは、この警告を利用し、うまくいけばバグの原因を排除するために働いてきました。ただし、新しい警告にはわずかな問題が1つしかありません。時には、NO-NULの初期化がまさに必要で意図されていることがあります。たとえば、 この宣言 から fs/cachefiles/key.c

    static const char cachefiles_charmap[64] =
	"0123456789"			/* 0 - 9 */
	"abcdefghijklmnopqrstuvwxyz"	/* 10 - 35 */
	"ABCDEFGHIJKLMNOPQRSTUVWXYZ"	/* 36 - 61 */
	"_-"				/* 62 - 63 */
	;

これ char 配列は、文字列としてではなく、ルックアップテーブルとして使用されるため、後続のヌルバイトは必要ありません。 GCC 15は、その使用法に気付いていないため、この宣言に対して偽陽性の警告を発します。カーネルには、このような宣言がある多くの場所があります。たとえば、ACPIコードは、4バイトの文字列アレイを多く使用して、4文字のACPI頭字語の同様に大きなセットを処理します。

当然のことながら、宣言に属性を追加して、警告を抑制しない場合、警告を抑制する方法があります。 char
配列は実際に文字列を保持していません:

    __attribute__((__nonstring__))

カーネル内、マクロ __NONSTRING その属性構文を短くするために使用されます。 GCC 15によって追加されたすべての警告を修正するために、主にKees Cookによって作業が進行中です。多くのパッチが流通しています。それらのかなりの数がLinux-Nextにあります。クックはまた、GCC開発者と協力して、この注釈がどのように機能するかを改善し、
問題を修正します カーネルプロジェクトが遭遇したこと。ただし、GCC 15が実際にリリースされていないため、この仕事を成し遂げる時間が残っていました。

Fedora 42 もっている ただし、リリースされ、Fedora開発者は、良くも悪くも、GCC 15のプレリリースバージョンをデフォルトのコンパイラとして含めることにしました。 Fedoraプロジェクトは、従うことを決定したようです 由緒ある赤い帽子の伝統
このリリースで。 Linus Torvaldsは、良くも悪くも、6.15-RC3のタグ付けとリリースの前日に開発システムをFedora 42に更新することを決定しました。しかし、新しいコンパイラでカーネルを構築しようとすると、関連するパッチがまだ彼のリポジトリにないため、事態はうまくいき始めました。 Torvaldsは、彼が遭遇した問題を修正するために、リリースの約2時間前にメインラインに直接適用され、彼自身の一連の変更で応答しました。それらが含まれています このパッチ
ACPIサブシステムでの警告の修正、および これです 上記の例を含めて、他のいくつかを修正します。その後、彼はタグ付けし、それらの変更で6.15-RC3を押し出しました。

残念ながら、彼の土壇場での変更により、GCC 15 Pre-Releaseの前にGCCのあらゆるバージョンのビルドが破壊されました。これは、Fedora 42を実行していない開発者にとってある程度の不便を生み出す可能性が高い問題です。 もう1つのパッチ 壊れた変更を裏付け、新しい警告を完全に無効にします。

これは引き寄せられました やや不機嫌なメモ クックから、彼はすでにすべての問題を修正するパッチを送っていたと言った。彼は、Torvaldsに変更を元に戻し、計画された修正を使用するように頼み、次のように付け加えました。未発表のコンパイラバージョンに更新するとき、それはもう一度、本当にイライラします“。torvalds 反対した、カーネルがそうでなければ構築に失敗したため、彼は変更を加える必要があると言っています。彼はまた、GCC 15を断言しました だった Fedora42にその存在によりリリースされました。 感銘を受けませんでした

はい、私はそれを理解していますが、あなたは誰とも調整しませんでした。警告文字列を検索することはありませんでしたが、マージ競合を作成した場所を確認することさえしませんでした。土壇場でツリーにテストされたパッチが不十分になり、GCCを使用してすべての人に壊れたRCリリースをカットしました

Torvalds 彼の地面に立っていたしかし、クックをメインラインに十分に速くメインラインに入れなかったことでクックを非難します。

この執筆時点で、状況が存在する場所です。他の人は間違いなく問題を適切に修正するために時間をかけて、ずっと意図されていた変更を追加します。しかし、この一連のイベントは、GCCの将来のバージョンがカーネルを構築できると予想されるときに、よりよく理解することで避けられたかもしれない感情をめぐるいくつかの悪い感情を生み出しました。

一種のコーダとして、Torvaldsはこの属性がどのように実装されているかについても根本的な意見の相違があると言う価値があります。
__NONSTRING__ 属性はタイプではなく変数に適用されるため、すべての場所で使用する必要があります。 char アレイは、nulバイトを追跡することなく使用されます。彼はむしろタイプに注釈を付け、そのタイプのすべてのインスタンスが文字列ではなくバイトを保持していることを示し、かなり多くの可変宣言をマークする必要性を避けます。しかし、それは属性がどのように機能するかではないので、カーネルに含める必要があります __NONSTRING すべてのマーカー char そのように使用される配列。




#いくつかの__nostring__乱流 #LWN.net

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。