[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 11/01 05:53 / Filesize : 267 KB / Number-of Response : 1023
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Rust part10



1 名前:デフォルトの名無しさん mailto:sage [2021/04/02(金) 21:38:04.11 ID:L7IeSfpL.net]
Mozilla発のRust言語のスレ

公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

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

日本語の情報
https://rust-jp.rs/

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

638 名前:デフォルトの名無しさん mailto:sage [2021/05/14(金) 20:32:01.67 ID:6SQ932Rj.net]
wasm,rustでまともに開発してたら絶対そんなこと思わんわ。。どいつもこいつも馬鹿すぎる

639 名前:デフォルトの名無しさん [2021/05/14(金) 20:40:33.59 ID:WB7bczPS.net]
それで、どんなまともなものを作っているんですか

640 名前:デフォルトの名無しさん [2021/05/14(金) 20:46:14.11 ID:5xLewDJ4.net]
>>624
とこが詐欺?
あなたはWebブラウザ上のWasmでRustではなくGoを用いているのですか?

641 名前:デフォルトの名無しさん mailto:sage [2021/05/14(金) 21:18:15.11 ID:TMXA3cLH.net]
>>627
それはあなたがまともにrust使えてないだけなんじゃないですかねぇ

642 名前:デフォルトの名無しさん mailto:sage [2021/05/14(金) 21:22:56.09 ID:yxEaYkUD.net]
話が具体的で説得力がある

643 名前:デフォルトの名無しさん mailto:sage [2021/05/14(金) 21:38:43.40 ID:2w1FBHD8.net]
>>572
形式的に書けているのは構文規則だけで
意味規則は自然言語で書かれているやんけ

644 名前:デフォルトの名無しさん mailto:sage [2021/05/14(金) 22:59:38.34 ID:R2Ezzb7N.net]
「Rustはスクリプト的に書ける」とかいう謎の言葉言う奴沢山いるけどなんぞ?
同一人物か?

645 名前:デフォルトの名無しさん mailto:sage [2021/05/14(金) 23:07:50.74 ID:TMXA3cLH.net]
我々が知らないところでevcxrが流行ってるのかもしれない

646 名前:デフォルトの名無しさん mailto:sage [2021/05/14(金) 23:23:46.43 ID:72ZodHJE.net]
google謹製のREPLね
エベクサ?



647 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 02:09:59.05 ID:BphhllcO.net]
>>633
Rubyと同じようなメソッドチェーンを使ったコードを見かけたから。

648 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 03:17:16.69 ID:vuo6fbRn.net]
ドットでメソッド呼び出しする言語は大概そういうライブラリ設計あるでしょ

649 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 11:05:39.24 ID:DTE+piln.net]
>>637
C++やJavaでは見たこと無い。
JSでも余り見かけない。

650 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 11:12:58.76 ID:Y+SvMVkX.net]
そもそもメソッドチェーンって「スクリプト的」なのか?

651 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 11:24:14.14 ID:C+CtGbiq.net]
前々からヤベェやつだとは思ってたが
レベルの低さが想像をはるかに超えてた

652 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 11:27:04.30 ID:MS0dCBGJ.net]
c言語みたいにcsvパーサーも自前で用意するような環境だとそらスクリプト的だろうね。

653 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 12:00:43.05 ID:A3vQNOxR.net]
unityとかUEがrustに対応しないかなあ

654 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 12:00:58.11 ID:ZgJC7yuF.net]
cargoみたいなパッケージマネージャがあるのもスクリプト的な要素のうちなのか?

655 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 12:10:16.46 ID:MS0dCBGJ.net]
cargoは低レイヤー慣れてる人からすれば邪魔でしかないけどね。

656 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 12:20:50.35 ID:DTE+piln.net]
SourceforgeなどでRustが好きといっている人の大部分はレベルが低いだろう。
そもそもこの世の中、大多数から受けるものにレベルが高いものがあったためしがない。
好きな言語ランキング上位のJS、Pythonも初心者向け言語であることは誰もが認めることだし。



657 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 12:40:11.21 ID:UqP25wMI.net]
sourceforge???
stackoverflowの調査かなんかと勘違いしたの?

658 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 12:41:57.93 ID:ZgJC7yuF.net]
>>644
どういうこと?ベアメタル向けでもcargo使うのが主流だと思っていた

659 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 12:47:56.99 ID:ZgJC7yuF.net]
>>645
使用者のレベルの高低と言語のレベル(?)の高低は一致するという主張かな?

言語のレベルが高いというのが最先端のテクノロジーを取り込むという意味ならrustの目指すところではないと思う
他の言語で実証されたコンセプトを取り込むと宣言してる(た?)はず
高レベルな言語が必要な人はこんな普及言語じゃなくてもっと尖った言語を使うか自分で作るべきなのでは

660 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 12:49:38.36 ID:DTE+piln.net]
>>646
ああ、そっちだった。
Stackoverflowも来てる人の頭の良さは一般大衆と同じくらいだから同じ。

661 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 12:53:14.42 ID:DTE+piln.net]
>>648
そういうことじゃなくて、
・Rustをほとんど使っても見てないのに勝手に「好き」と言っていることが分かってる。
・Stackoverflowのような沢山の人が集まる場所の調査では、必ずJSやPythonのような初心者向けの言語が人気となるわけだから、そこの人々が好きだと思う言語は、JSやPythonのような感覚で使えると勝手に思い込んである蓋然性が高い。
 ただし、現実はRustは実際には使ってないのに勝手に言っている。
ということ。

662 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 13:20:44.67 ID:YOv93GRR.net]
stackoverflowの調査の話なら、調査内容を勘違いしている
あれは「今Rustを使っている人が、今後もRustを使い続けたいかどうか」のアンケート結果をmost lovedと言ってるだけ
だからJSやPythonユーザの意見は入ってない
そもそもloveって言葉に語弊があるし、日本語にしたときに「人気の」とかなって余計訳がわからなくなってる

663 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 13:25:20.53 ID:YOv93GRR.net]
たぶん「最も嫌嫌使っている人が少ない言語」みたいなのが正確な気がするな

664 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 14:15:44.60 ID:MW7lNw7H.net]
「今使ってる人が次も使いたいと思うか?」ってJetBrainsの調査でも毎回入れてくる項目だな
海外のアンケートではよく見るやつ

665 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 14:17:03.39 ID:DTE+piln.net]
>>651
もし前半の通りなら、今Rustを使ってる人なんて極一握りの物好きだけだから
「love」なのは当たり前で調査結果が意味が無い。

666 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 14:19:45.06 ID:eXXN4CKf.net]
一生でどれか一つのプログラミング言語しか覚えられないとして
Rust選ぶ人いますか?

選択したとして別にその言語がいきなりマスターできるわけでなく
ただその言語しか覚えられないというだけですが



667 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 14:23:36.58 ID:DTE+piln.net]
今rustを使ってる人って、自ら進んで使おうとした人に限られるから
嫌いな人がほとんどいないのは当たり前だから、調査結果にバイアスが
掛かりすぎていることになるな。

668 名前:はちみつ餃子 mailto:sage [2021/05/15(土) 15:05:35.65 ID:pVi51x8H.net]
そういえば C++ でメンバ関数の評価順序に関して設計者も気づいてなかった考慮漏れが見つかった
(よくあるパターンが実際には未定義だった) って話があったな。
www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0145r0.pdf
C++17 で修正されているはずだけど。

宣言的な表現や関数的な表現をプログラミング言語に取り込む試みは数多いが
現実は順序からは逃れられぬのだ……。

669 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 15:16:25.44 ID:HcoKJY+/.net]
Rustがスクリプト的に書けるかどうかはおいといて、
個人用のツール書く言語をPythonからRustに乗り換えたっつー話は一応あるな
https://hayatoito.github.io/2017/faq/#programming-language

670 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 15:20:52.26 ID:DTE+piln.net]
>>658
Googleがnode.jsで書いていたものをRustにしたと聞いたぞ。

671 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 15:23:50.02 ID:TrqVEcq2.net]
全部書き直すのは逆に効率悪そう
速度的にキツイ場合のみでいいんじゃないか

672 名前: []
[ここ壊れてます]

673 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 15:32:34.68 ID:H/3gPTTR.net]
どちらかといえば速度よりも変更頻度が動機になると思う
静的チェックツールも増えてはいるけどコンパイル型はいじる時の安心感が違う

674 名前:はちみつ餃子 mailto:sage [2021/05/15(土) 15:37:59.52 ID:pVi51x8H.net]
>>660
言語を跨いで呼出すときはその境界で色々な処理が挟まったりもするので、
まだらに入り乱れるような形になるとそれはそれで実行性能の足を引っ張ることもある。
状況次第なので一概には言えないけど、言語を変更すると決めたなら
そこそこ大きい単位で乗り換えるのが妥当な場合は結構あると思うよ。

675 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 17:32:17.46 ID:jwQMP5Oj.net]
>>661
それはあるね
個人用のツールだとそんなに真面目にテストも書かないから
動的型だと忘れた頃に改修したくなって詰む

676 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 18:53:39.15 ID:IpomZGOJ.net]
>>642
MSがdotnet対応のRust#出したらUnityワンチャンあるんやない?



677 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 19:10:58.08 ID:Y+SvMVkX.net]
そこはRust/CLIで。

678 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 21:52:45.98 ID:TrqVEcq2.net]
GCのあるrustに存在意義などない

679 名前:デフォルトの名無しさん mailto:sage [2021/05/15(土) 22:13:28.16 ID:Y+SvMVkX.net]
GCとデストラクタが共存するC++/CLIはなかなか興味深い言語だった。

680 名前:デフォルトの名無しさん mailto:sage [2021/05/16(日) 11:00:47.47 ID:9EXRd3vl.net]
RustのGCって初期はまた復活されるかもーみたいなノリじゃなかったっけ?

681 名前:デフォルトの名無しさん mailto:sage [2021/05/16(日) 11:12:01.38 ID:SPtqbmz9.net]
RC関連についてはやるとか?

682 名前:デフォルトの名無しさん mailto:sage [2021/05/16(日) 12:07:45.66 ID:MDYO1Tug.net]
@ pointerとか ~ pointerとかあった頃の話?

683 名前:デフォルトの名無しさん mailto:sage [2021/05/16(日) 15:06:48.66 ID:JH7fFMWR.net]
>>665
確かにそっちか
>>666
GCがあるRustって言うよりはunsafeを外部リンクで呼び出してるようなもんだろ

684 名前:デフォルトの名無しさん mailto:sage [2021/05/17(月) 10:53:44.01 ID:ZSkTvtbm.net]
rustが覇権を取るにはPHPみたいにドキュメントの翻訳をたくさん作ること
そしてサンプルコードを盛り込むこと

685 名前:デフォルトの名無しさん mailto:sage [2021/05/18(火) 19:40:20.00 ID:A1yOEMnk.net]
>2021 Editionは2021年10月にリリースされる。今回のエディションは「Rustの使用感を大きく改善する」ものになるという

あんまり前にこんな発表しないでほしい
やる気なくなる

686 名前:デフォルトの名無しさん mailto:sage [2021/05/18(火) 19:44:35.79 ID:Gj41gD2H.net]
>>673
ちゃんと発表資料見れば分かるけど、大して使用感変わらんよ
クロージャー使いまくりの人が一番恩恵を受けるかな



687 名前:デフォルトの名無しさん mailto:sage [2021/05/18(火) 20:19:55.73 ID:Z0RWJbQc.net]
所有権は移動するときのほうにマークが出るべきなんじゃあ

688 名前:デフォルトの名無しさん mailto:sage [2021/05/19(水) 07:47:56.56 ID:X700JkCT.net]
まぁコストかかるのはコピーだし

689 名前:デフォルトの名無しさん mailto:sage [2021/05/19(水) 08:05:05.13 ID:o3bqBTNO.net]
Rustの真似をしようとする言語がないのがふしぎだ

690 名前:デフォルトの名無しさん mailto:sage [2021/05/19(水) 12:30:25.52 ID:HmkTJiD6.net]
https://en.m.wikipedia.org/wiki/Rust_(programming_language)
wikipedia見ただけだけど Crystal, Elm

691 名前:デフォルトの名無しさん mailto:sage [2021/05/19(水) 12:30:46.25 ID:HmkTJiD6.net]
など影響を与えた言語は列挙されてた

692 名前:デフォルトの名無しさん mailto:sage [2021/05/19(水) 12:42:47.10 ID:9T1L9lvJ.net]
>>678
Elmのどこが?と思ってソースを読んだら
関数型言語なら大体持ってるEither型の名前を Result, Ok, Error にしたところがRust由来とな

うーむ持ってきたのは名前だけなのにInfluencedか

693 名前:デフォルトの名無しさん mailto:sage [2021/05/19(水) 12:59:40.27 ID:u9Tr9lyP.net]
Gleam
https://gleam.run/book/tour/index.html

OwnershipやLifetimeの考え方を採用した言語はまだ聞いたことがない

694 名前:デフォルトの名無しさん mailto:sage [2021/05/19(水) 13:11:21.07 ID:bDX8SBSl.net]
所有権の考え方を採用している言語としてはC++などがあります

695 名前:デフォルトの名無しさん mailto:sage [2021/05/19(水) 14:00:04.90 ID:NOe9g/vN.net]
まあインスタンスの共有については何らかの言語サポートが入ってもおかしくないかもね

696 名前:デフォルトの名無しさん mailto:sage [2021/05/20(木) 01:09:22.49 ID:WwVMFHF+.net]
DにもOwnership入ったとか小耳に挟んだだけなら



697 名前:デフォルトの名無しさん mailto:sage [2021/05/20(木) 17:03:02.09 ID:VKAk8Olu.net]
https://forest.watch.impress.co.jp/docs/news/1325564.html
凄いね

698 名前:デフォルトの名無しさん mailto:sage [2021/05/20(木) 17:06:31.55 ID:13olK3Lw.net]
>>685
UIがReactというのが残念

699 名前:デフォルトの名無しさん mailto:sage [2021/05/20(木) 18:20:18.69 ID:PiC1UW/o.net]
逆に何ならいいんだよ

700 名前:デフォルトの名無しさん mailto:sage [2021/05/20(木) 18:33:43.55 ID:UXe9/StR.net]
GUIフレームワークをRustで作るうまみあまりなさそう

701 名前:デフォルトの名無しさん mailto:sage [2021/05/20(木) 19:39:25.12 ID:QrP75Wi1.net]
Rustで作ってあるなら絶対大丈夫だな!

702 名前:デフォルトの名無しさん mailto:sage [2021/05/20(木) 22:57:01.82 ID:HbCDuKW4.net]
設計がクソだとダメ
ダメなヤツはなにやってもダメ

703 名前:デフォルトの名無しさん [2021/05/21(金) 11:45:49.77 ID:r1IBz1vL.net]
>>538
(1)もちろん例外を使わずとも関数呼び出し等がエラー値を返すことで全て実現できます

(2)ところがエラー値が返ってくると毎回if文やmatch等でエラー時はそこですぐreturnする等の処理を書く必要があって面倒かつコードが醜いため例外の使用が好まれました

(3)Rustでは関数の返り値型をResult<T,E>とすることに加えて「?」オペレーター(旧try!マクロ)を使うことで(2)の処理を自動化しました

つまり関数等呼び出し毎にifやmatch等で返り値エラーチェック&returnの記述をしなくても末尾に「?」を記述するだけで済みます

これでチェーンも出来て具体的には
b = a.hage()?.hige()?.hoge()?
と書くだけでhage()でエラーが返れば早期エラーreturnしますしhige()やhoge()でエラーでも同様です
関数の返り値型がResult<T,E>であることが使用条件です
これはもちろん正常値の<T>型とエラー<E>型のenumです

これらにより関数を多段に深く呼び出していても深い所でのエラーがすぐにreturnを多段にしてエラーが戻って来ます
したがってRustでは例外を使わなくても困らないのです

704 名前:デフォルトの名無しさん [2021/05/21(金) 13:37:02.96 ID:J6y23PLS.net]
すまんrust新参者なんだが、Rust By Exampleのコードいじって勉強してて、以下のコードが疑問に感じられた。
以下のプログラムはmain関数内のif文は実行されないとは明らかなんやが、それでもsubの行でいわゆるuse-after-freeのコンパイルエラーが出る。
これはif文が実行されなくてもdropは実行されるということなんですか?
下のコードみたいにuse-after-freeになるかならないかがif文の条件満たすかどうかによって決まるようなプログラムでも
rustでは一緒くたにuse-after-freeになるとみなされるってことなんですね?
そう考えればそこまで賢くないコンパイラですね
struct Droppable {
id: &'static i8,
}

impl Drop for Droppable {
fn drop(&mut self) {
println!("> Dropping {}", self.id);
}
}

fn sub(d: &Droppable) {
if *d.id == 0 {
drop(d);
println!("> Test {}", d.id);
}
}
fn main() {
let _a = Droppable { id: &0 };
if *_a.id == 1 {
drop(_a);
}
sub(&_a);
}

705 名前:デフォルトの名無しさん [2021/05/21(金) 13:4 ]
[ここ壊れてます]

706 名前:0:53.52 ID:J6y23PLS.net mailto: ちなみにコンパイルエラーも貼っておく

Compiling playground v0.0.1 (/playground)
error[E0382]: borrow of moved value: `_a`
--> src/main.rs:22:9
|
18 | let _a = Droppable { id: &0 };
| -- move occurs because `_a` has type `Droppable`, which does not implement the `Copy` trait
19 | if *_a.id == 1 {
20 | drop(_a);
| -- value moved here
21 | }
22 | sub(&_a);
| ^^^ value borrowed here after move //ここでuse-after-free errorが発生!

error: aborting due to previous error

For more information about this error, try `rustc --explain E0382`.
error: could not compile `playground`

To learn more, run the command again with --verbose.
[]
[ここ壊れてます]



707 名前:デフォルトの名無しさん [2021/05/21(金) 13:44:28.52 ID:J6y23PLS.net]
Compiling playground v0.0.1 (/playground)
error[E0382]: borrow of moved value: `_a`
--> src/main.rs:22:9
|
| let _a = Droppable { id: &0 };
| -- move occurs because `_a` has type `Droppable`, which does not implement the `Copy` trait
| if *_a.id == 1 {
| drop(_a);
| -- value moved here
| }
| sub(&_a);
| ^^^ value borrowed here after move //ここでuse-after-free errorが発生!

error: aborting due to previous error

For more information about this error, try `rustc --explain E0382`.
error: could not compile `playground`

To learn more, run the command again with --verbose.

見やすくした

708 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 14:49:33.29 ID:vx/ErwhM.net]
意味のないコードだよ

709 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 14:53:16.15 ID:PNtD97K1.net]
コンパイラは別に値まで見ないからな
clippyが意味のない分岐だよと指摘してくれるのかどうかは知らんが

710 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 14:55:24.20 ID:HgMuIEwp.net]
>>692
基本的に条件分岐はpredがコンパイル時に評価できる場合でも true/false 両方あり得るものとして扱われるよ
その後の最適化フェーズであり得ないルートは除去されるだろうけど最適化の結果でコンパイルエラー差異が出ないようにする考え方なんだと思われる
無限ループ専用の構文であるloopが導入された背景もたぶんこのあたりにある

711 名前:デフォルトの名無しさん [2021/05/21(金) 15:52:58.09 ID:J6y23PLS.net]
>>697
trueのときもdrop、falseのときもdropされるとみなされるということは、
if文によってheap領域で確保しているメモリを解放するかしないか場合分けできないってことじゃん
それって不便では?

712 名前:デフォルトの名無しさん [2021/05/21(金) 16:14:23.61 ID:qRzkKAr2.net]
>>698 これ元のコード見てみ
これifの条件がtrueだろうがfalseだろうがsub(&_a);は実行されるやん
ifの条件がfalseのときには問題なく実行できるけど、もしifの条件がtrueになって_aがdropされてしまった後にsub(&_a);が実行されてしまうと開放された値を使うことになる
だからRustコンパイラはエラーを吐くんだよ

713 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 16:15:51.92 ID:91Y2FzX3.net]
いや、普通に場合分けはできるが…

どちらかというとifの条件を変えるたびにコンパイルが通ったり通らなかったりするほうが不便では?
そこにifがあるってことは(将来的にとか何らかの条件で)実行される可能性があるからあるんでしょ
もし絶対に実行されないことが確定してるなら書く意味ないし

714 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 16:19:22.28 ID:91Y2FzX3.net]
場合分けしたいならこんな感じで

if *_a.id == 1 {
drop(_a);
} else {
sub(&_a);
}

715 名前:デフォルトの名無しさん [2021/05/21(金) 17:42:19.92 ID:J6y23PLS.net]
>>700
言ってる意味がさっぱりわからん
>>692のプログラムにあるとおり
現実問題、将来的に決して実行されるわけがないif文というものは存在するし
if文があるというのは実行される可能性のあるの十分条件でもなければ必要条件でもなわけでもないんやが。
ワイが言いたいのは仮にrustの型システムを無視して>>692のコードをそのままコンパイルしたとしても
if文は実行されないわけだから安全なはずなものまでを省いているというところが不思議だってことや
つまりuse-after-freeバグが現実には起きないコードまでもif文の他の条件でUAFバグが起きるがために
ひとまとめにUAFが起きる

716 名前:ニみなすrustコンパイラの姿勢がif文である条件のときだけfreeするコードを書くのを認めないようにみえるという
ワイの感想に繋がってるわけでして
[]
[ここ壊れてます]



717 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 17:53:39.45 ID:IHGXJo1X.net]
use of moved valueやborrow of moved valueを
use-after-freeとして理解してるのがそもそも間違ってる

The Bookを読んでLifetimeとOwnershipを復習してくれ

718 名前:デフォルトの名無しさん [2021/05/21(金) 18:00:55.07 ID:J6y23PLS.net]
>>692のコードをcに書き直してみたらこうなる
} Droppable;
void drop(Droppable* d) {
printf("> Dropping %d", d->id);
free(d);
}

void sub(Droppable* d) {
if (d->id == 0) {
//free(d);
printf("> Test %d", d->id);
}
}
int main() {
Droppable* _a;
_a = malloc(sizeof(Droppable));
_a->id = 0;

if (_a->id == 1) {
drop(_a);
}
sub(_a);
}

719 名前:デフォルトの名無しさん [2021/05/21(金) 18:01:46.42 ID:J6y23PLS.net]
これはrustでは弾かれるはずの「if文のある条件のときだけヒープのある部分をfree」というコードのはずだが
安全なCのプログラムや コンパイルは通るしランタイムエラーも起こさない。
メモリ安全なプログラムの中では、cで書けるプログラムのほうがrustで書けるプログラムより広いんだね
rustはメモリ安全なcのプログラムと同等な処理を書けない部分もあって不便じゃないかっていうのが結局のところワイの疑問になるんや
じゃあrustでは「if文のある条件のときだけヒープのある部分をfree」のコードをどう書くんや?
メモリ安全性を損なってるわけでもない処理ではないはずなんやがrustのコンパイラははじくぞ?

720 名前:デフォルトの名無しさん [2021/05/21(金) 18:03:27.13 ID:J6y23PLS.net]
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id;
} Droppable;
void drop(Droppable* d) {
printf("> Dropping %d", d->id);
free(d);
}

void sub(Droppable* d) {
if (d->id == 0) {
//free(d);
printf("> Test %d", d->id);
}
}
int main() {
Droppable* _a;
_a = malloc(sizeof(Droppable));
_a->id = 0;

if (_a->id == 1) {
drop(_a);
}
sub(_a);
}

ほい完全版

721 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 18:06:23.36 ID:p9FphGnI.net]
>>705
unsafe使え、というかもうちょっと具体的な例じゃないと困る
今まで出された例だと「最初から絶対通らないの分かってるならif文消せばいい」としか思えないので

722 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 18:12:17.78 ID:91Y2FzX3.net]
別にわざわざCで書いてもらわなくても安全なのは分かるよ
今のRustコンパイラで通らないのはボローチェッカーが最適化前にあるからなんで
部分的にでも先に最適化すれば通るようにはできるだろう
ただそれをしたい動機が分からない
本当にifが実行される可能性が一切ないなら単に消せばいい、といしか言いようがないので

723 名前:デフォルトの名無しさん [2021/05/21(金) 18:14:06.78 ID:J6y23PLS.net]
>>703
それただの論点そらしだよね
UAFってrustの独特なメモリ管理手法と相反する用語ではないし
use of moved valueやborrow of moved valueもUAFを阻止するためのものだよね
じゃあrustでは「if文のある条件のときだけヒープのある部分をfree」のコードをどう書くんや?

724 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 18:18:59.35 ID:p9FphGnI.net]
>>709
DroppableのメンバにBox<i8>持たせろ
仮に"drop"された後でもsubが正常に動くことが期待されているなら、そこで使うべきなのはdropではない

725 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 18:22:54.40 ID:91Y2FzX3.net]
というか >>701 で書いたif/elseの例はちゃんと「if文のある条件のときだけヒープのある部分をfree」になっているのに何か不満なのか

726 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 18:24:13.35 ID:IHGXJo1X.net]
>>709
UAFを阻止するためだけにあるものじゃないから
やり方は>>701で教えてくれてるやろ

とりあえずThe Book読んでね



727 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 18:31:38.95 ID:p9FphGnI.net]
>>709
これでどうですか?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=9b05ca192ab0fd529b6de05dcc64a8c9

728 名前:デフォルトの名無しさん [2021/05/21(金) 18:38:40.69 ID:J6y23PLS.net]
>>711
そうやん
rustって不思議やね

729 名前:デフォルトの名無しさん [2021/05/21(金) 18:44:49.25 ID:J6y23PLS.net]
解決しました。
なにはともあれありがとうございました。>>701の方に救われました。
ここまで関わってくださった皆様まことに協力ありがとうございました。感謝いたします。

730 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 19:24:50.36 ID:91Y2FzX3.net]
「理論的に安全な任意のコードは通るべき」ってイメージだったのかな
実際にはそんなことはなくて、上の例のようなコードを通すためには色々なトレードオフがあるから
単に「理論的に安全」ってだけで無条件に実装されることはない
もっと具体的なユースケースがあって、みんなが「これは通らないと不便だよね」ってなったものが実装される
数年前に実装されたnon lexical lifetimesなんかはまさにその例だね

731 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 19:31:11.66 ID:bfSFy0HM.net]
はぎゃーん

732 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 21:43:48.32 ID:HgMuIEwp.net]
クロージャの disjoint capture が破壊的変更になるのは分かるんだけど最初からこうなってなかったのはなぜ?

733 名前:デフォルトの名無しさん mailto:sage [2021/05/21(金) 22:34:26.09 ID:vpqVq/KA.net]
iter()とinto_iter()の使い分けが分からない

iter()じゃないといけない場合があるのは分かるんだが

734 名前:デフォルトの名無しさん [2021/05/21(金) 22:49:37.59 ID:+ok17UuV.net]
into_iterは所有権を奪いItemを得ることができる
iterは&Itemを得る
他のintoで始まるものは所有権を奪うことになってる

735 名前:デフォルトの名無しさん [2021/05/21(金) 23:22:44.96 ID:qRzkKAr2.net]
>>711 Rustコンパイラが問題視してるのは開放された値を使ってしまう可能性があることで、それが修正された >>701 のコードは問題ないから通る

736 名前:デフォルトの名無しさん mailto:sage [2021/05/22(土) 00:04:28.82 ID:yRhz4OAW.net]
>>719
Rustでの変数の受け渡し方は
by (shared) reference、by mutable reference、by valueの3つなので
それに対応していろいろなものが3種類1セットになってる

イテレータならiter(), iter_mut(), into_iter()
クロージャならFn, FnMut, FnOnce
コンバージョンならAsRef, AsMut, From/Into



737 名前:デフォルトの名無しさん mailto:sage [2021/05/22(土) 00:34:10.91 ID:RuplHzwP.net]
as_foo(), to_foo(), into_foo() の違いも覚えておくとよいかもね

738 名前:デフォルトの名無しさん mailto:sage [2021/05/22(土) 00:45:11.88 ID:yRhz4OAW.net]
覚えておくとはいいのはそうだけど、そのセットは少し観点違うよね
https://rust-lang.github.io/api-guidelines/naming.html#ad-hoc-conversions-follow-as_-to_-into_-conventions-c-conv






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<267KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef