Rust part23
■ このスレッドは過去ログ倉庫に格納されています
今回の件でRustの安全性が確実になったのが興味深いよな アンチが必死に探してきた問題も>>350 でunsafe利用だった >>371 「indexがその範囲にある時のみ有効な型」の意味がよく分かってないけど 実行時に型の方でindex検査して無効時にpanic起こすなら普通にusizeでgetしてunwrapしようよ unsafeにする意味がない >>374 実行時コストをかけないためにget_uncheckedを使うのが一般的 その代わりロジックでindexが範囲内であることを保証する(ことがてきる時に使われる汎用的な手法) 誰にでもunsafeが使えてしまうのが問題なのでは? 原則使えないくらいが、バカでも安全になるからRustの方向性に合ってる気がする。 Rust の制限は機械的に検証可能な範囲に絞ったらそうなったということであって、その制限の範囲内で十分にプログラムが書けるというものでもない。 まあ思ったよりも足りるけどやっぱり必要だから unsafe はある。 >>375 「indexがその範囲にある時のみ有効な型」でも有効範囲が実行時に変動するなら>>350 の引数のindexをその型に変えたところでsafeにしたらダメだよ なるほど、欲しい機能を実装していったら、結構安全になったって感じなのかな。OpenBSDみたいな偏執なのとは違う感じか? indexの境界チェックが律速になるようなコード書いてみてえな >>376 型宣言の時に type My_Int is range -1 .. 5; 範囲宣言(マイナスでも、1からでもOK)できて、範囲を越えたらエラー 配列もその範囲指定で自由に作成できる。 >>383 定数じゃなければ結局実行時にチェックするってことだよね >>384 新しい型はint型とは独立した型なんだから変数にしたってその新しい型じゃないとコンパイル時にエラー。 >>384 何十年も前なのですまそ array(-2)とかarray(6)をアクセスしたら例外発生 array(-1)はOK type Month is range 1..12 type Month_Array is array(Month) of Integer; ma : Month_Array := (1,2,3,4,5,6,7,8,9,10,11,12); for m in ma'first..ma'last loop // カウンタは1から12 ma(m) = m; end loop; 今回の話は実行時境界チェックを無くす(減らす)実行時コスト削減の話だけど そのAdaの例だと実行時に範囲外に値が動けてアクセスで例外発生するから何の解決にもなっていないね How much does Rust's bounds checking actually cost? https://blog.readyset.io/bounds-checks/ こんなもんjavaの速度低下が境界値チェックによるものじゃないってことで話は終わっとると思ったけどな。 問題は浮動小数の取り扱いだっての。 unsafeは可能な限り避けるべきで safe Rustでの改善をまずすべき その次にindex checkの有無で意味のあるパフォ向上がある時のみ考える 現実にはsafe Rustでの改善ができてないことが多い 例えばよく見かける例としては iが動いていくのにa[i]でアクセスしてしまう これはiの範囲checkとa[i]の範囲checkで二重checkになるbad pattern 参照(ポインタ)化することで範囲checkを1回に減らせる unsafeは極力避けろというアドバイスばっかりでunsafeを適切に閉じ込める基本的な考え方や実装パターンの啓蒙が不十分なんだよね unsafeを良く知れば知るほど自然と避けるようになるから避けろ避けろと言うよりもunsafeに関する知識を深められるようにする方が大事 「unsafeの閉じ込めにはセンスがいるから、教えてもらわないと出来ないやつはunsafeを使うな」 が言える限界な気がする。現にunsafeを適切に閉じ込めるためのノウハウを継承できる資料とかがないので unsafeはライブラリ作者とかがハード周りアクセスするために使うもので、コーダーが使うものじゃないだろ。 unsafe可能ソースファイル用の拡張子を別途用意して、rsファイルはunsafe禁止にしてもいいくらいじゃない? >>393 そしたら全部を unsafe 可能版で書いちゃうのが世の中の現実ってもんなんだよ。 >>392 センスの問題ではないと思うが仮にセンスが必要だとしてもセンスがあるやつが適切に閉じ込めた事例とダメな事例を類型化してパターンナレッジとして浸透させればいいだけ 今はそれが全然できてないから>>350 のような基本的なミスを犯すやつが後を絶たない windows-rs とか使うと絶望するよな。もうちょいラップして安全なAPIも提供してほしい。 >>395 ~すればいいだけって言う奴はたいてい本人はやらないんだよなぁ。 >>397 問題点の指摘や解決策の提案と 問題解決のために実際に誰が動くのかという 2つの異なるものを混同したらだめだよ マネジメント101 その素晴らしい提案がなぜされていないのか考えよう そしてなぜ自分は実行から逃げているのか考えよう >>394 Rustが流行りそうな一番の理由は「管理側」が「コーダー」にunsafeみたいなことをやらせたくないということなんだから、どこでもunsafeとか管理側が許さんだろ。 unsafe はコンパイラが安全性を「論理的に検証できない」部分であって、理論上の都合で出来た区分だよ。 危険な操作も含まれるけど危険な部分を分けれてるわけではない。 もちろん unsafe を制限する規約のプロジェクトがあったって良いが、そのための機能じゃないよ。 >>401 安全性をコンパイラが検証できないなら、なおのこと制限すべきだと思うがね。 デフォルト禁止でもいいくらい。 >>402 だからそうしたいならそうすりゃいいって話をしてる。 あなたが裁量権をもつプロジェクトでは。 私が反論してるのは「そのためのものだ」という部分に対して。 >>403 Rustのコンセプトとニーズからすれば、どこでもunsafe使えるのは中途半端だ、ということだよ。 unsafeはデフォルト禁止でいいよ。 理想をいえばunsafeなんて無いならサイコーだったんだろうね rust陣営もしゃあなしでunsafe導入したんやろうし unsafeなしですべてがセーフで効率的だったら そりゃあrustは本当に素晴らしい文句なしの言語だったやろな 生ポインタすなわちCPUによるメモリアクセスはunsafe そこが出発点 unsafeを組み合わせてunsafeを閉じ込めたsafeなインタフェースを提供できる それがsafe Rustの基本原理 つまりunsafeに行き着くためunsafe無しでは何もできない これが真理 一方で unsafeを閉じ込めたライブラリ利用可を前提にすれば unsafeを用いないsafe Rustでほとんど大抵のことが実現できるのも事実 >>406 だったらデフォルトunsafe禁止で良い。 どこでもunsafe okはやっぱりチグハグ。 そこまでsafeな事にこだわるなら、Haskellに行けばいいのでは…? >>404 「そうであって欲しいと自分は思っている」なら別にいいよ。 ニーズとかコンセプトとか、ありもしないものを根拠にしてることに反論されてるんだよ。 #![forbid(unsafe_code)] を宣言すればいい もちろんすべてはunsafeへ行き着くため unsafeを禁止できるのは自分のコード部分だけ unsafeな部分の拡張子を変えるというのが有効とはあんま思えんのだよな 平気でunsafe使ってくるガイジは当然平気でunsafeな拡張子を使ってくるだろうという予想する >>409 公式の「効率的で信頼できるソフトウェアを誰もがつくれる言語」に従うなら、安全でもなくて誰もが使えるわけでもないunsafeはデフォルト禁止にすべきだろ。やっぱりチグハグだわ。 >>411 拡張子以外だとどんなのができるかねぇ。コーダー向けRustとライブラリアン向けRustで完全に分けるぐらい? rustもいろいろ問題を抱えてるんだね プログラマの習熟が必要だっていうなら流行らないだろう メモリ安全なソフトウェア書くことを優先するなら土方が適当に使えるjavaやc#があるだろうし 新しいc/c++/rustと競合する決定版のような言語が出てきてrustはさらなる傍流に押しやられそう >>412 こう書くだけでunsafeの使用が禁止されます #![forbid(unsafe_code)] >>413 普通の人はunsafeなんか使いませんからRustは安全で何も問題ありません >>414 >411みたいなマキャベリガイジが混ざると破綻しますな。 MSとかGoogleとかの管理側がRustに期待するのはそういった部分含めた安全性だろ。 >>415 これでunsafeが使用禁止となり安全なsafe Rustになる #![forbid(unsafe_code)] コンパイラがunsafeをエラーとして弾く 結局いつもの「無知なアンチ vs 無知な信者」の薄っぺらい対立になっちゃうのな まあハスケルなんかもinvalidな変数使うようにっての広めるのには役立ったからrustもそういう位置に落ち着くだろ。 unsafeを使う人はライブラリ作成者がほとんどで、残りはシビアなインフラ作成者 一般プログラマーはunsafeを使わずに、unsafeが閉じ止められたライブラリのsafeなインターフェースのみ用いる もしunsafeを用いて閉じ込めてsafeなインターフェースを提供できる新たなパターンを発見した時のみ、 その部分だけを切り出してライブラリ作成者になれる それができない一般プログラマーはunsafeに縁がなく、unsafeを気にする必要がない >>419 そうならやっぱりデフォルト禁止にすべきだな。一般コーダーはunsafeを使えないようにしてコードの安全性を高めるべき。 Rustのデフォルトムーブとかshared xor mutableとかは安全側に倒しているのに、なんでunsafeだけはユルユルなのかね。 unsafeって書かないといけないってのは結構デフォ禁止よりの処置だと思うが このメッセージが伝わらない相手にはもうunsafeの文法を分けてunsafeだけ難しくするとかしかなさそう でもわざわざ難しい文法を用意すると言うのも馬鹿らしい話だ 必要な各企業、各プロジェクトなどで義務付け #![forbid(unsafe_code)] これでunsafeの話はおしまい 他の言語と比べてRustはコーディング規約もAPI規約も公式で楽 Rust公式APIガイドライン https://rust-lang.github.io/api-guidelines/ >>422 公式のドキュメントで #![forbid(unsafe_code)] の説明を探しているんだけど、どこにあるのかしらん? doc.rust-lang.org/nomicon/safe-unsafe-meaning.html の1行でおしまい? forbidもunsafe_codeもrustcのlintの一部だな doc.rust-lang.org/rustc/lints/levels.html#forbid doc.rust-lang.org/rustc/lints/listing/allowed-by-default.html#unsafe-code Rust Foundationによる資格認定試験に合格した者だけにunsafe使用パスワードが発行されるようにするしかないな。 どの開発でも #![forbid(unsafe_code)]が原則 どうしてもunsafeが必要なら その安全ロジックを関係者で協議後に #![deny(unsafe_code)]へそのモジュールのみ変更し 許可する部分のみを #![allow(unsafe_code)]として監視対象 といった感じが一般的かと 監視対象を極一部に限定できて 全体はコンパイラにより保証できるため 他のプログラミング言語より扱いやすい >>420 一般とそうでない奴は誰がどうやって区別するのさ? 時間がない時に焦ってunsafe使って書いたコードは長期利用すると大変なことになるので書いてから1時間以内に使って捨てよう >>429 safeで書くのが早くて楽で安全 わずかでもパフォ上げる必要性のあるような箇所が生じない限り、unsafeを検討する人は存在しない >>430 unsafeの使用は、その論拠の安全性の検討や、それ以前に必要性の検討などが必要となるため、時間がかかる safe Rustが楽で早く書けて安全 >>432 安全性の検討も必要な検討も全部スキップして「えいや」ってやればsafe rustより速く書き上がることもあるのでは? 雑にunsafe使って早く書けるのはFFIくらいかな FFIはどのみちunsafe必須だけど、事前条件とかの検討せずに雑にsafe化してしまうならそれは確かに早い pure Rustでunsafeの方が早いケースはちょっと思いつかないな >>427 そりゃプロジェクト管理者だろ。 そもそもRust採用するメリットはソースコードの品質管理しか無いし。 デフォルトunsafe禁止は何回か話題に出てきているのな。 >>426 それぐらいやらないとRust採用するメリット無さそうだよな。 初心者ぼく「禁止しないといけないようなもんが標準で使えるって結局それ危険な言語なんでは? そもそも普通に書いててunsafe使いたいなって場面がない 多人数で書いてるならforbidで落としてもいいけど コードレビューでちょっとでも見ればunsafe使ってることは明らかなんだし、いずれにしてもどうでもいい >>436 じゃunsafe使うな、で済む話じゃん。 rustもプログラマがザコだと使いこなせない言語なんだろ? 人材確保すら苦労するってメジャーになれるのかよ たしかにプログラムの品質がいいから出世するって見たことないわ 逆にクソ過ぎて出世できない奴はいるかも知れんがそういう奴はプログラム云々の問題ではないからな unsafeは面倒 Rustで書いていてunsafeを使いたい気分になることがない さらに通常のプログラミングでunsafeを使うメリットがあるケースが訪れることはまずない 初心者や一般的な人は、unsafeの使い所がないなら、unsafeを使うようなすごい人でもミスをしたり理解不足だったりするって事だから、すごい人が精進すれば解決でしょ。 >>440 PMやったこと無いの? unsafe使うなと管理するより、そもそも使えない方が遥かに楽。 >>442 C++ とかだと使いこなせてないのになんとなく動いちゃったりするから…… 使えてないなら使えないほうがちょっとマシなんだよ。 >>448 言語機能的にunsafeって書かなければそもそも使えないじゃん。 >>448 そのあたりの管理は開発TLの仕事だと思ってたがPMが兼任することもあるのね unsafeでサクッと終わらせてどんどん仕事取ろうぜ safeでチンタラやってる無能に仕事を回すな アンチはunsafeを使うと早く書けると誤解しているのが面白い 早くもなければ楽でもないので普通は使わない 「借用エラー出たらとりあえずunsafeと書いとけば回避できる」くらいのイメージなんかね このスレの優秀な人たちを安月給で揃えたチーム作れたらunsafeについて真面目に取り組んでもいいんだが 正常なコミュニケーション力を持った優秀なエンジニア →こいつらは出世するのでプログラミングスキルは生かされない方向に進む 正常なコミュニケーション力がない優秀なエンジニア →こいつらはどうでもいいことばかりブツブツ言っててイマイチスキルが生かされない どうしたら優秀なエンジニア揃えられるんや… カチョー「では進捗を報告してください」 unsafe_man「アノー、チョット時間かかってオリマシテ、アンセーフが、ソノー(怒涛の勢いで難しいことを話し続ける)」 カチョー「???」 >>457 放っておいても勝手に集まるから心配しなくていいよ そこに混ざりたいなら自身も優秀なエンジニアになる必要はあるけど >>459 すまん、集まってるとこの実名あげてくれんか? >>458 いきなり人格攻撃かよ?Rustらしいな unsafe使う機会ってほぼないよな よほどシビアな低レベルライブラリ作成かFFI部分くらいじゃないか 優秀なエンジニアは担当している仕事がいつ頃終わるか明確に答えられる人 でunsafeを使いこなせるかどうかなんか無関係 これいつまでかかるのと聞かれていつまでに終わるか言えて理由も言える人 システムプログラミング用途も売りにしてなかった? Cと同等のことをしてみせようってんなら unsafeくらい当たり前に常用するやろ?しらんけど ボクは使いません!みたいな意見は誰も求めてないからw unsafe使うと変更する時にだるくなるからできるだけ使わない グローバル変数使うのと同じ気分 「グローバル変数くらい当たり前に常用するやろ?しらんけど ボクは使いません!みたいな意見は誰も求めてないからw」 とか言われたら知らん 使う必要があるからunsafeってもんがあるんであって 使う必要がない人の意見や感想は求められてないんよ 使うべきとか使うべきじゃないとか 普通はどうとか普通はどうじゃないとか 無意味な応酬はやめよう コーダーの「使う使わない」の問題じゃなくて、管理者の「許可する禁止する」の問題なんだよ。 >>451 君の時間の無駄ってこと? こんなところで毎日無駄な時間過ごしてるのに? それって君がやらなければいいだけだよね >>468 一連のunsafeコントで初めてまともな意見だな ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる