Rust part30

レス数が900を超えています。1000を超えると表示できなくなるよ。
1デフォルトの名無しさん
垢版 |
2025/05/28(水) 09:31:36.60ID:ciITeZ5D
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

公式ドキュメント
https://www.rust-lang.org/learn

Web上の実行環境
https://play.rust-lang.org

※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/

※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※次スレは原則>>980が立てること

前スレ
Rust part29
https://mevius.5ch.net/test/read.cgi/tech/1746200850/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
2025/06/16(月) 06:07:30.55ID:Y7h+7ucI
記事あんま理解できてないけどヌルポインタってそんなにまずいもんなの?
コンパイラーが検出してくれるし、スコープから外れた変数はドロップされるからそもそも参照されないかと思ってた
809デフォルトの名無しさん
垢版 |
2025/06/16(月) 06:43:29.69ID:pyVTMG/F
ヌルポインタ参照って
プログラムをCとかunsafeとか使わずにRustで全て作ってるとしたら起き得ないことであってる?
2025/06/16(月) 08:20:04.56ID:GmbZlZxT
>>808-809
ヌルポインタの問題は型の非互換性、本質的には機能の非互換性の問題。

古いJavaで顕著だけど、ヌルポインタは何の機能もサポートしないのにコンパイル時はほとんどすべての型に化けることができるから、コンパイル時に問題を発見できずに実行時に問題になることがある。
本来なら互換性を保つためにヌルオブジェクトとかを使うべきだけど、言語で禁止しているわけではないので、低能力コーダーとか無能ライブラリアンとかはヌルポインタを返す関数とかを作って問題になる。

safe rust は基本的にヌルポインタを使えないので、このようなトラブルになることは少ないかと。
2025/06/16(月) 11:48:14.62ID:d1GW0AGS
問題の本質はヌルポじゃないだろ
publickeyの人はそれがわかってない

てかGoogleの品質管理体制も杜撰すぎるな
812デフォルトの名無しさん
垢版 |
2025/06/16(月) 12:21:10.35ID:LhShA12G
ガッ!
2025/06/16(月) 12:30:45.07ID:Y7h+7ucI
空白のフィールド含んだだけでクラッシュとかよく分かんないよ
俺がテストせずにこのプログラムをリリースさせた責任者だったら会社に残れないな。明らかにテスト捏造してるから
——
新しいポリシーデータには意図せず空白のフィールドが含まれており、これをサービスコントロールが読み込んで実行したところ、ヌルポインタ参照となりクラッシュが発生します
——
2025/06/16(月) 13:38:36.81ID:Zx2RP+Vb
要は不具合を引き起こす特定のパターンがあり、テストで発見されなかったってことだろ
たまたま結果としてヌルポでクラッシュしただけで、仮にヌルポの可能性に気づけていたとしてもそれ自体がバグの原因でない以上、
問題のパターンが別の形で障害を起こしていた可能性を否定できないな
2025/06/16(月) 14:56:07.05ID:3OfwotkI
もしRustで実装していれば、パニックですんでいたのにな
2025/06/16(月) 15:28:10.23ID:89xCrI9h
今回の事態を招いた最も重大な要因は「リリース手続きの欠陥」であって、ヌルポ参照という"クラッシュに至る個別の事象"に着目した対策に終始するのは悪手(ヌルポ参照以外の要因で本件のような事象が再発しても良いのか、という問いにyesと答えることに他ならない)
2025/06/16(月) 15:38:50.32ID:2OOusEms
>>814
>要は不具合を引き起こす特定のパターンがあり、テストで発見されなかったってことだろ

特定のパターンというか「新機能のために新しく適用する全世界共通のポリシーデータ」と「新機能」の組み合わせでクラッシュするんだから本番環境に適用するポリシーデータでは一切テストしてなかったってことでしょ

feature flagがなければステージングでのテストも行わず本番と同時適用ってのも意味がわからない
2025/06/16(月) 15:40:30.06ID:2OOusEms
>>815
パニックでも結果は同じ
2025/06/16(月) 16:50:55.12ID:3OrQmcm3
>>815
Rustで実装していればOption型になる
unwrapしない限りpanicは起きない
2025/06/16(月) 17:11:52.79ID:6J/NsGPY
JavaはTとOption<T>を区別しないからStringでもnull検査パスしてるか分からんのよね
誰かが検査してると思ってたら誰も検査してなかったり逆に至る所で何重にも検査されてたり
2025/06/16(月) 17:56:55.33ID:Y40wNqxo
>>819
今回のやつはRustで実装しててもunwrapしてたケースだろう

>>820
Javaの場合は@Nullableみたいなアノテーション使ってビルド時にチェッカーを走らせる
2025/06/16(月) 18:02:11.42ID:3OrQmcm3
>>821
Optionをunwrapしていいのは常にSome自明時と
異常時にpanicで落ちていい時のみ
2025/06/16(月) 18:48:18.73ID:Y40wNqxo
>>822
後者に該当

ポリシーデータから必須項目が欠落しているような状態はヌルポを発生させたプログラマーから見ればプログラムを即停止すべき異常事態という認識
2025/06/16(月) 19:02:14.08ID:F+AaTG3L
Rustはわりとunwrapというかコンテキスト外し一般を使う人が多い印象があるね
そのあたりはやはりベターC++という感じがする
2025/06/16(月) 19:03:13.08ID:WftbHuxu
>>823
異常時に停止してよい時のみpanicが使われて暴走やセキュリティの穴を防止するんだよ
2025/06/16(月) 19:04:58.04ID:WftbHuxu
>>824
落ちてはいけないプログラムでそんなことする人はいないよ
2025/06/16(月) 19:45:53.03ID:GmbZlZxT
>>823
panicにするかどうかを決めるのはサーバーを実装する側じゃなくてサーバーを使うユーザー側だろ。
Linusじゃないけど、サーバー側がランタイムエラーでパニックを発生させるのは根本的に問題がある。単にエラーを返すべき。
2025/06/16(月) 19:53:50.09ID:xdTbb2+R
Rustは絶対安心安全なんだよ
2025/06/16(月) 22:35:10.42ID:GFXQS+aF
>>827
もちろんあるべき姿としてはエラーを返すなりフォールバックさせるなりすべき
だけど現実はヌルポでエラーも返さずクラッシュさせてたわけでRustに置き換えればpanicで落としてたのと同じようなもの

つまりRustを使っていれば防げたかというと今回のケースは防げなかった可能性が高いということ
2025/06/16(月) 23:23:51.15ID:n/id3DH6
Rustを使えば防げただろう
2025/06/16(月) 23:25:29.39ID:n/id3DH6
>>824
そういう時はこれ

[lints.clippy]
unwrap_used = "deny"
2025/06/17(火) 07:28:54.01ID:nAKE0zH5
>>829
ならpanicさせる>823の考えは間違いだね。

rustも安全性を標榜するならpanic禁止モードを用意すべきだわ。
2025/06/17(火) 08:53:29.58ID:wIiKTA/n
DoS攻撃脆弱性でregexのCVEがあったけど
関連サービスの事を無視して自分勝手にpanicしちゃったら同じ脆弱性だよね
834デフォルトの名無しさん
垢版 |
2025/06/17(火) 09:28:01.71ID:qKSR12sf
ヌルポ騒動が起きるたびにRustの重要性が引き上がる
2025/06/17(火) 09:35:12.84ID:9ReeLirD
>>834
ポリシーの内容をチェックして。受け入れ可能じゃなければResultでテキトーにErr返したら済んだんじゃないの?

パニックさせる必要ほんとにあったと思ってる?
2025/06/17(火) 10:10:19.32ID:ArcAimKK
>>835
それでもこの件では障害になることには違いないのでは
クラッシュはしないかもしれないが
2025/06/17(火) 10:27:20.42ID:HytcwfDv
Rustで書くなら関数は必ずResultもしくはOptionを返すことになり、上位で処理される
2025/06/17(火) 10:32:24.66ID:Q1H3y5Wh
>>837
>>822にもあるけど
> Optionをunwrapしていいのは常にSome自明時と
その「自明」をコンパイラが静的分析するか>>831がデフォルトじゃないかぎり
隠れ unsafe
2025/06/17(火) 10:35:09.70ID:HytcwfDv
>>838
unwrapは使われない
?オペレータで上位へ委託するか
match / if let等で処理される
2025/06/17(火) 10:41:17.77ID:wEWjoXoE
このGoogleの件に関して言うなら、ポリシーの読み込み失敗即ちロールバックなんだろうからpanicは妥当
起動時に必須の環境変数が無い場合にpanicさせるようなもんだね
2025/06/17(火) 10:46:12.73ID:ya3T3y3J
panicで全体を止めたくない時はUnwindSafeな処理単位をcatch_unwindで実行すればいい
使ったことないけど
2025/06/17(火) 10:51:31.79ID:gnbFtFWo
>>832
ヌルポでクラッシュさせてたのは間違いではなかったとでも?

>>823はヌルポでクラッシュさせてた人たちの認識
その人たちが仮にRustを使ってたら同じようにpanicで落とすだけ
つまりRustを使っていたとしても障害は防げないという話

それに今回の障害を見てエラーハンドリングしていれば問題なかったと考えるのは短絡的すぎる
一番の問題点は一サービスの一コンポーネントがクラッシュしただけであらゆるサービスが全面的にダウンしたという点にある
だからあらゆるコンポーネントを絶対panicしないように作ろうとするよりも一コンポーネントがpanicしたとしても全面的なシステムダウンに繋がらない仕組みを作ろうと考えることが今回のような障害を防ぐための第一歩
2025/06/17(火) 10:56:21.14ID:tkXXIxpc
>>842
まともなシステムはそれだな
プロセスが落ちてもハンドリングされる
2025/06/17(火) 10:58:00.04ID:tkXXIxpc
異常状態のままプロセスが走り続けるよりもpanicなどでプロセス終了が正しいシステム構築
2025/06/17(火) 11:09:29.63ID:QpxoSzQp
異常状態のまま動き続ける言語よりさ
panic or エラー処理されるRustが良い結論は変わらんよね
2025/06/17(火) 11:13:48.44ID:wEWjoXoE
>>842
Google Cloud APIのコントロールプレーンのコアコンポーネントはさすがに一サービスの一コンポーネントとかいうレベルじゃないよ
OSのカーネルみたいなもん
こんなのヘタに誤動作を続けられたら会社が吹き飛ぶようなセキュリティ事故に繋がる可能性もあるわけで、死んでくれた方がマシ
2025/06/17(火) 11:52:15.15ID:e/HQQ23L
ワンワンパニック
2025/06/17(火) 12:50:17.15ID:ya3T3y3J
Javaで
if (value == null) {
throw AppException();
}
を書き忘れるのとRustで
let Some(value) = opt_value else { return Err(AppError); }
の代わりに
let value = opt_value.unwrap();
と書くのは発生リスクが全然違うと思うんだけど
Javaでうっかりnullチェックを忘れる人はRustでもうっかりunwrapを使うものなのか?
2025/06/17(火) 13:10:12.25ID:aeCwWEdf
>>848
本人判断で「自明」と決めつけて意図的にunwrapを使うのでは
2025/06/17(火) 13:36:52.80ID:gAVRJIie
>>822によれば
本人判断で「panicで落ちていい」と決めつけて意図的にunwrapを使うパターンもある
2025/06/17(火) 14:21:36.03ID:w2F36Aoo
>>848
Rustでは必要により明示的にpanicさせる.unwrap()とコードを書いた時のみpanicが起きる
意思が必要
2025/06/17(火) 15:48:15.44ID:FL91roa2
>>846
クラッシュしたのはコントロールプレーンの一部であるポリシーチェックシステムのさらにその一部のバイナリ
もっと言えば問題が起きたのはそのまた一部のクォータチェック部分

クォータチェックができなければGCPの全サービスを落とすべきというビジネス判断としてはなくはないがIncident Reportを見る限りGoogleはそうは考えてない
2025/06/17(火) 16:05:37.54ID:UZ5mCAEQ
Rustにしとけ
続行不可能で意図的にpanicさせるか
きちんとResult/Option処理するかになる
2025/06/17(火) 16:27:46.74ID:9ReeLirD
リリースしてから実際にポリシー変更が発生するまでの2週間、
テストやりこんで最後のバグだしするまでの時間とみなすか、
リリースヨシ!と思ってたかだよな

リリース後も2週間頑張ってテストやったけど境界条件探すの下手くそで見つけられませんでした、で通るかな。自分のことのようにゾッとする
2025/06/17(火) 17:05:59.65ID:FL91roa2
>>854
プログラムの変更とポリシーデータの変更は責任者も管轄組織もプロセスも違うんだと思う
ポリシーデータのほうはビジネスよりの組織が管轄というのはよくある話
なのでDev的にはリリースヨシ!

改善点の2点目に「Regardless of the business need for 〜」とあるからOpsはBizの政治力で本来とは違うプロセスを強制させられたのかもしれない
2025/06/17(火) 18:12:51.30ID:FL91roa2
ここに内部事情を含めていろいろ書いてあった
https://news.ycombinator.com/item?id=44274563
2025/06/18(水) 00:29:09.64ID:1jrMASAC
ここでの議論と同じだね
Rustでpanicするの明示的にpanicを起こすコードを書いたときだけ
2025/06/18(水) 01:06:16.44ID:aQwOTYhv
>>857
>Rustでpanicするの明示的にpanicを起こすコードを書いたときだけ

ここでもHNでもそんな議論はされてない
ただ複オジが連呼してるだけ
2025/06/18(水) 01:09:01.01ID:ZwZRjmCs
さっさとC++捨ててRustにすれば防げたのにな
2025/06/18(水) 01:12:36.99ID:SA0JPy/4
>>858
初心者は今回のこのまとめを見るといい
https://news.ycombinator.com/item?id=44281839
2025/06/18(水) 02:58:44.97ID:vm71nNgD
Googleの事案なんてどうでもよくてインシデントにかこつけてRustの布教がしたいだけ
だから何を書いても無駄
2025/06/18(水) 06:20:38.83ID:KrGEp9Dg
Rustを採用していれば防げた事案
2025/06/18(水) 09:57:10.50ID:NQ+tIPxW
>>848
本質は同じ

書き忘れではなくロジカルな思い違いもある
ここでnullはないやろとここErrはないやろは同じで思い込みだから

言語によって優劣とかじゃなく人間の限界がある
2025/06/18(水) 10:09:02.91ID:4yVSzLnj
>>863
全く違う
unwrap()はNone時にpanicを起こすための関数
書き忘れでpanicしない
2025/06/18(水) 10:20:51.18ID:NQ+tIPxW
> 書き忘れではなくロジカルな思い違いもある
2025/06/18(水) 10:31:14.78ID:GRTFL2K0
panicさせてはいけないプログラムでpanicさせる関数を呼ぶバカはいない
reviewでもバレる
2025/06/18(水) 10:49:25.62ID:NQ+tIPxW
メモリリークさせてはいけないぷろぐらむでめもりりーくさせるばかはいない!
2025/06/18(水) 11:01:39.66ID:Ulz+jHl5
Rustを使えばメモリリークも未定義動作もなく安全安心よ
2025/06/18(水) 11:23:14.90ID:lQpFkqVW
haskellと比べて、unwrapが気軽に使えすぎる気はする
2025/06/18(水) 11:33:39.23ID:S+5h0Q7c
ErrやNoneの時にpanic!を呼びたい場合が多いからunwrapがある
呼びたくないのに使うのは痴呆
2025/06/18(水) 11:34:34.48ID:FuDCb+RV
index out of boundsやdivide by zeroをはじめ意図せずpanicを起こすケースなんていくらでもある
2025/06/18(水) 11:39:44.34ID:SMOhWm6L
panicはcatchできるし
そのthreadが死ぬだけだし
困らんよな
2025/06/18(水) 11:43:26.69ID:U/ksL7Wg
>>871
panic禁止のプログラムのためにpanicしない方法が用意されていますよ
勉強しましょう
2025/06/18(水) 11:45:58.97ID:3o9Ti177
>>860
視野の狭い末端プログラマーの視点だな
システム全体が見えていない
2025/06/18(水) 11:46:56.90ID:3o9Ti177
>>873
視野の狭い末端プログラマーの視点だな
システム全体が見えていない
2025/06/18(水) 11:50:22.96ID:7xP0Uzu5
>>874
落ちてはいけないシステムをUB地雷だらけのC++で書くことが愚か
2025/06/18(水) 11:52:41.70ID:qy96omZz
>>875
Rustのスレでシステム全体って何やねん
説明してみ
2025/06/18(水) 12:16:05.81ID:iDJPvmxA
「意図したpanic」禁止したら良い
その「意図」が正しいのかコンパイラが静的分析出来ないから
2025/06/18(水) 12:29:52.79ID:rx2CZFrG
>>878
panicはプログラムやスレッドが続行不可能な時に正しく終了させるためにあります
禁止は困ります
2025/06/18(水) 13:09:11.05ID:uPLWgFQC
mseditorがpanicしたら編集中のデータが飛ぶけど、それが「正しく終了」か?
2025/06/18(水) 14:28:18.37ID:AeXwuQQu
ヌルポやバッファオーバーランに比べれば比較的マシ
2025/06/18(水) 15:01:02.42ID:90mEbGf5
意図的ヌルポでセグフォと
意図的unwrap panicでabortは同じ
2025/06/18(水) 15:13:41.28ID:5Mu65nKv
会社の怖い先輩が俺のコードはunwrapでいいんだよと言ったら、そうするしかないよね
2025/06/18(水) 15:24:13.90ID:45cvT+VF
まさかとは思うがnullチェックしてれば防げた障害だと思ってるやつがいるのか?
2025/06/18(水) 15:37:47.95ID:s5c+Ng5v
ぬるぽでクラッシュしたと聞いたけどnullチェックで防げないぬるぽってあるんすか
2025/06/18(水) 15:49:01.71ID:FHNv6txf
今どきC++で新たなコードを書くから悲惨な事故が起きた
2025/06/18(水) 16:01:28.34ID:hZyAyOg0
>>884
Rustなら防げたと言ってるあのおじさんを除けばそこまてのバカはいないかと
2025/06/18(水) 16:01:44.34ID:s5c+Ng5v
設定がおかしい場合の例外処理フローはあったけどそこに入る前にぬるぽで爆死した認識
2025/06/18(水) 16:35:49.37ID:YaS/uO3Z
RustならコンパイラがAIよりも厳密なチェックをしてるから防げるだろ
2025/06/18(水) 17:03:37.08ID:d8qsI0SX
Rustは言語仕様が優れているけど
言語仕様が腐っていればAIでも防げない
891デフォルトの名無しさん
垢版 |
2025/06/18(水) 17:43:59.13ID:mspDq+p2
世界最長のコンテキストウィンドウ100万トークン入力・8万トークン出力対応にもかかわらずたった7800万円でトレーニングされたAIモデル「MiniMax-M1」がオープンソースで公開され誰でもダウンロード可能に
2025年06月18日 11時43分
https://gigazine.net/news/20250618-minimax-m1-open-source/
>>MiniMax-M1は、合計4560億のパラメーターが含まれており、トークンごとに459億のパラメーターがアクティブになるとのこと。これはDeepSeek R1の8倍に相当するコンテキストウィンドウです
>>以下のグラフは競技レベルの数学、コーディング、ソフトウェアエンジニアリング、エージェントツールの使用、長文理解タスクにおけるパフォーマンスを主要な商用AIモデルと比較したもの。赤色がMiniMax-M1で、どのタスクにおいても競合AIモデルに匹敵するパフォーマンスを発揮できている
>>MiiniMax-M1はいくつかのベンチマーク、特に長いコンテキスト駆動のベンチマークでClaude Opus 4のパフォーマンスを上回りました」と報告
※AIを動作させている動画あり
↓上記のAIお下記をプレイさせれば性能が判明する
Gemini 2.5 Proは手持ちのポケモンが瀕死になるとパニックに陥る
2025年06月18日 12時30分
https://gigazine.net/news/20250618-pokemon-gemini-panic/

[プロテクトガードやセキュリティーホール発見可能]
※1 プログラムのバグ技[裏抜け道]を使用できる=チートコードを発見可能
・ マリオカートのショートカットはプレイヤー「極悪人」の表の抜け道でNPC「一般人」は使用不可能
[インサイダー/談合/なねーロンダリング/霊感商法など行う時の悪行で音波や電波をしての悪行の方法を発見可能
※ 政治家の法律上の抜け道を仕込める=ある業種だけの法律の抜け道を発見可能
[一般大衆の思考である特定の極悪人から目線を特定の統合失調症へ返させる装置]
※ AIは正確な情報で人間を信用させれる=AIは嘘の情報を一部混ぜて人間を洗脳できる
2025/06/18(水) 18:45:36.06ID:JUQ8VjRJ
まさかとは思ってたがnullチェックで防げたと勘違いしてるやつ結構いるんだな
2025/06/18(水) 19:12:39.40ID:M/E4rLLd
>読み込みデータに空白フィールドがあり、これがヌルポインタとなって参照した時点でクラッシュを引き起こした。
2025/06/18(水) 20:36:14.97ID:QsB71xf7
OptionやResultの型をきっかけとして問題に気付けた可能性はあるんじゃない?
あくまで間接的な可能性でしかなく、この件をもってRustだったら起きなかったとかいうのはアホ丸出しだけども
2025/06/18(水) 20:49:33.05ID:JDJPNF+q
Rustなら上位へそのエラー返して
その入力データに対するAPIでエラー返すだけだろ
2025/06/18(水) 22:27:10.05ID:/Y6EEbbi
>>894
いいかげんにしろよ
Rustでどうやって問題が起きるんだよ
2025/06/18(水) 22:47:29.81ID:BBnSRnVn
この件については、クラッシュを回避しエラーレスポンスを返したところで結局障害になることには違いがないからだな
2025/06/18(水) 22:51:57.91ID:ikP0pQuf
>>894
間接的な可能性もないでしょ
2025/06/18(水) 23:03:07.16ID:0KvtUriT
>>897
Googleのレポート見ろよ
エラーを返せていれば障害にならなかった
2025/06/18(水) 23:18:21.28ID:dYsLBH+C
>>899
そんなことどこにも書いてないぞ
エラーを返していればなんで障害にならないんだ?
回復不能なエラーだぞ
2025/06/18(水) 23:25:54.18ID:7PLt8980
Rustなら回避できたケースだけど
無理!と言う人は具体的に無理なシナリオを示してみたら?
2025/06/18(水) 23:41:41.61ID:sPCFWro/
ワロ
理解できないから教えてくれと言えばいいものを
2025/06/18(水) 23:53:20.04ID:jD4yZQcZ
公式読めよ
Rustにしてればポリシー変更データをエラーにして受け付けず落ちることもなく被害なし
2025/06/19(木) 00:10:11.24ID:oQzIUk1I
設定のミスで1台のATMが使えなくなるか全部のATMが使えなくなるかみたいな話でしょ
どっちも障害だから同じだって考え方もあれば
障害を1台に抑えることに価値があるって考え方もある
Rustでも防げないって人は前者だしRustなら防げたって人は後者
どっちの考え方もそれなりに正しい
2025/06/19(木) 00:25:10.66ID:KZlMfI+O
>>897
exponential backoffが実装されてなかったから
リクエスト単位のエラー返しにしてた場合は
復旧にもっと時間がかかってたと思われる

かといってC++でヌルポはだめだけどな
2025/06/19(木) 00:48:27.34ID:ftBjTcDx
>>905
新たなポリシー変更要求がエラーで受け付けられなくて落ちることもないから障害が起きていない
2025/06/19(木) 01:27:03.00ID:l2wwX0Hv
>>906
どこにそんなこと書いてる?
新しいポリシーがSpannerに書かれてレプリケートされた後の話だろこれ
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況