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/
Rust part10
■ このスレッドは過去ログ倉庫に格納されています
2021/04/02(金) 21:38:04.11ID:L7IeSfpL
649デフォルトの名無しさん
2021/05/15(土) 12:49:38.36ID:DTE+piln650デフォルトの名無しさん
2021/05/15(土) 12:53:14.42ID:DTE+piln >>648
そういうことじゃなくて、
・Rustをほとんど使っても見てないのに勝手に「好き」と言っていることが分かってる。
・Stackoverflowのような沢山の人が集まる場所の調査では、必ずJSやPythonのような初心者向けの言語が人気となるわけだから、そこの人々が好きだと思う言語は、JSやPythonのような感覚で使えると勝手に思い込んである蓋然性が高い。
ただし、現実はRustは実際には使ってないのに勝手に言っている。
ということ。
そういうことじゃなくて、
・Rustをほとんど使っても見てないのに勝手に「好き」と言っていることが分かってる。
・Stackoverflowのような沢山の人が集まる場所の調査では、必ずJSやPythonのような初心者向けの言語が人気となるわけだから、そこの人々が好きだと思う言語は、JSやPythonのような感覚で使えると勝手に思い込んである蓋然性が高い。
ただし、現実はRustは実際には使ってないのに勝手に言っている。
ということ。
651デフォルトの名無しさん
2021/05/15(土) 13:20:44.67ID:YOv93GRR stackoverflowの調査の話なら、調査内容を勘違いしている
あれは「今Rustを使っている人が、今後もRustを使い続けたいかどうか」のアンケート結果をmost lovedと言ってるだけ
だからJSやPythonユーザの意見は入ってない
そもそもloveって言葉に語弊があるし、日本語にしたときに「人気の」とかなって余計訳がわからなくなってる
あれは「今Rustを使っている人が、今後もRustを使い続けたいかどうか」のアンケート結果をmost lovedと言ってるだけ
だからJSやPythonユーザの意見は入ってない
そもそもloveって言葉に語弊があるし、日本語にしたときに「人気の」とかなって余計訳がわからなくなってる
652デフォルトの名無しさん
2021/05/15(土) 13:25:20.53ID:YOv93GRR たぶん「最も嫌嫌使っている人が少ない言語」みたいなのが正確な気がするな
653デフォルトの名無しさん
2021/05/15(土) 14:15:44.60ID:MW7lNw7H 「今使ってる人が次も使いたいと思うか?」ってJetBrainsの調査でも毎回入れてくる項目だな
海外のアンケートではよく見るやつ
海外のアンケートではよく見るやつ
654デフォルトの名無しさん
2021/05/15(土) 14:17:03.39ID:DTE+piln655デフォルトの名無しさん
2021/05/15(土) 14:19:45.06ID:eXXN4CKf 一生でどれか一つのプログラミング言語しか覚えられないとして
Rust選ぶ人いますか?
選択したとして別にその言語がいきなりマスターできるわけでなく
ただその言語しか覚えられないというだけですが
Rust選ぶ人いますか?
選択したとして別にその言語がいきなりマスターできるわけでなく
ただその言語しか覚えられないというだけですが
656デフォルトの名無しさん
2021/05/15(土) 14:23:36.58ID:DTE+piln 今rustを使ってる人って、自ら進んで使おうとした人に限られるから
嫌いな人がほとんどいないのは当たり前だから、調査結果にバイアスが
掛かりすぎていることになるな。
嫌いな人がほとんどいないのは当たり前だから、調査結果にバイアスが
掛かりすぎていることになるな。
657はちみつ餃子 ◆8X2XSCHEME
2021/05/15(土) 15:05:35.65ID:pVi51x8H そういえば C++ でメンバ関数の評価順序に関して設計者も気づいてなかった考慮漏れが見つかった
(よくあるパターンが実際には未定義だった) って話があったな。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0145r0.pdf
C++17 で修正されているはずだけど。
宣言的な表現や関数的な表現をプログラミング言語に取り込む試みは数多いが
現実は順序からは逃れられぬのだ……。
(よくあるパターンが実際には未定義だった) って話があったな。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0145r0.pdf
C++17 で修正されているはずだけど。
宣言的な表現や関数的な表現をプログラミング言語に取り込む試みは数多いが
現実は順序からは逃れられぬのだ……。
658デフォルトの名無しさん
2021/05/15(土) 15:16:25.44ID:HcoKJY+/ Rustがスクリプト的に書けるかどうかはおいといて、
個人用のツール書く言語をPythonからRustに乗り換えたっつー話は一応あるな
https://hayatoito.github.io/2017/faq/#programming-language
個人用のツール書く言語をPythonからRustに乗り換えたっつー話は一応あるな
https://hayatoito.github.io/2017/faq/#programming-language
659デフォルトの名無しさん
2021/05/15(土) 15:20:52.26ID:DTE+piln >>658
Googleがnode.jsで書いていたものをRustにしたと聞いたぞ。
Googleがnode.jsで書いていたものをRustにしたと聞いたぞ。
660デフォルトの名無しさん
2021/05/15(土) 15:23:50.02ID:TrqVEcq2 全部書き直すのは逆に効率悪そう
速度的にキツイ場合のみでいいんじゃないか?
速度的にキツイ場合のみでいいんじゃないか?
661デフォルトの名無しさん
2021/05/15(土) 15:32:34.68ID:H/3gPTTR どちらかといえば速度よりも変更頻度が動機になると思う
静的チェックツールも増えてはいるけどコンパイル型はいじる時の安心感が違う
静的チェックツールも増えてはいるけどコンパイル型はいじる時の安心感が違う
662はちみつ餃子 ◆8X2XSCHEME
2021/05/15(土) 15:37:59.52ID:pVi51x8H >>660
言語を跨いで呼出すときはその境界で色々な処理が挟まったりもするので、
まだらに入り乱れるような形になるとそれはそれで実行性能の足を引っ張ることもある。
状況次第なので一概には言えないけど、言語を変更すると決めたなら
そこそこ大きい単位で乗り換えるのが妥当な場合は結構あると思うよ。
言語を跨いで呼出すときはその境界で色々な処理が挟まったりもするので、
まだらに入り乱れるような形になるとそれはそれで実行性能の足を引っ張ることもある。
状況次第なので一概には言えないけど、言語を変更すると決めたなら
そこそこ大きい単位で乗り換えるのが妥当な場合は結構あると思うよ。
663デフォルトの名無しさん
2021/05/15(土) 17:32:17.46ID:jwQMP5Oj664デフォルトの名無しさん
2021/05/15(土) 18:53:39.15ID:IpomZGOJ >>642
MSがdotnet対応のRust#出したらUnityワンチャンあるんやない?
MSがdotnet対応のRust#出したらUnityワンチャンあるんやない?
665デフォルトの名無しさん
2021/05/15(土) 19:10:58.08ID:Y+SvMVkX そこはRust/CLIで。
666デフォルトの名無しさん
2021/05/15(土) 21:52:45.98ID:TrqVEcq2 GCのあるrustに存在意義などない
667デフォルトの名無しさん
2021/05/15(土) 22:13:28.16ID:Y+SvMVkX GCとデストラクタが共存するC++/CLIはなかなか興味深い言語だった。
668デフォルトの名無しさん
2021/05/16(日) 11:00:47.47ID:9EXRd3vl RustのGCって初期はまた復活されるかもーみたいなノリじゃなかったっけ?
669デフォルトの名無しさん
2021/05/16(日) 11:12:01.38ID:SPtqbmz9 RC関連についてはやるとか?
670デフォルトの名無しさん
2021/05/16(日) 12:07:45.66ID:MDYO1Tug @ pointerとか ~ pointerとかあった頃の話?
671デフォルトの名無しさん
2021/05/16(日) 15:06:48.66ID:JH7fFMWR672デフォルトの名無しさん
2021/05/17(月) 10:53:44.01ID:ZSkTvtbm rustが覇権を取るにはPHPみたいにドキュメントの翻訳をたくさん作ること
そしてサンプルコードを盛り込むこと
そしてサンプルコードを盛り込むこと
673デフォルトの名無しさん
2021/05/18(火) 19:40:20.00ID:A1yOEMnk >2021 Editionは2021年10月にリリースされる。今回のエディションは「Rustの使用感を大きく改善する」ものになるという
あんまり前にこんな発表しないでほしい
やる気なくなる
あんまり前にこんな発表しないでほしい
やる気なくなる
674デフォルトの名無しさん
2021/05/18(火) 19:44:35.79ID:Gj41gD2H675デフォルトの名無しさん
2021/05/18(火) 20:19:55.73ID:Z0RWJbQc 所有権は移動するときのほうにマークが出るべきなんじゃあ
676デフォルトの名無しさん
2021/05/19(水) 07:47:56.56ID:X700JkCT まぁコストかかるのはコピーだし
677デフォルトの名無しさん
2021/05/19(水) 08:05:05.13ID:o3bqBTNO Rustの真似をしようとする言語がないのがふしぎだ
678デフォルトの名無しさん
2021/05/19(水) 12:30:25.52ID:HmkTJiD6 https://en.m.wikipedia.org/wiki/Rust_(programming_language)
wikipedia見ただけだけど Crystal, Elm
wikipedia見ただけだけど Crystal, Elm
679デフォルトの名無しさん
2021/05/19(水) 12:30:46.25ID:HmkTJiD6 など影響を与えた言語は列挙されてた
680デフォルトの名無しさん
2021/05/19(水) 12:42:47.10ID:9T1L9lvJ >>678
Elmのどこが?と思ってソースを読んだら
関数型言語なら大体持ってるEither型の名前を Result, Ok, Error にしたところがRust由来とな
うーむ持ってきたのは名前だけなのにInfluencedか
Elmのどこが?と思ってソースを読んだら
関数型言語なら大体持ってるEither型の名前を Result, Ok, Error にしたところがRust由来とな
うーむ持ってきたのは名前だけなのにInfluencedか
681デフォルトの名無しさん
2021/05/19(水) 12:59:40.27ID:u9Tr9lyP682デフォルトの名無しさん
2021/05/19(水) 13:11:21.07ID:bDX8SBSl 所有権の考え方を採用している言語としてはC++などがあります
683デフォルトの名無しさん
2021/05/19(水) 14:00:04.90ID:NOe9g/vN まあインスタンスの共有については何らかの言語サポートが入ってもおかしくないかもね
684デフォルトの名無しさん
2021/05/20(木) 01:09:22.49ID:WwVMFHF+ DにもOwnership入ったとか小耳に挟んだだけなら
685デフォルトの名無しさん
2021/05/20(木) 17:03:02.09ID:VKAk8Olu686デフォルトの名無しさん
2021/05/20(木) 17:06:31.55ID:13olK3Lw >>685
UIがReactというのが残念
UIがReactというのが残念
687デフォルトの名無しさん
2021/05/20(木) 18:20:18.69ID:PiC1UW/o 逆に何ならいいんだよ
688デフォルトの名無しさん
2021/05/20(木) 18:33:43.55ID:UXe9/StR GUIフレームワークをRustで作るうまみあまりなさそう
689デフォルトの名無しさん
2021/05/20(木) 19:39:25.12ID:QrP75Wi1 Rustで作ってあるなら絶対大丈夫だな!
690デフォルトの名無しさん
2021/05/20(木) 22:57:01.82ID:HbCDuKW4 設計がクソだとダメ
ダメなヤツはなにやってもダメ
ダメなヤツはなにやってもダメ
691デフォルトの名無しさん
2021/05/21(金) 11:45:49.77ID:r1IBz1vL >>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では例外を使わなくても困らないのです
(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では例外を使わなくても困らないのです
692デフォルトの名無しさん
2021/05/21(金) 13:37:02.96ID:J6y23PLS すまん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);
}
以下のプログラムは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);
}
693デフォルトの名無しさん
2021/05/21(金) 13:40:53.52ID:J6y23PLS ちなみにコンパイルエラーも貼っておく
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.
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.
694デフォルトの名無しさん
2021/05/21(金) 13:44:28.52ID:J6y23PLS 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.
見やすくした
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.
見やすくした
695デフォルトの名無しさん
2021/05/21(金) 14:49:33.29ID:vx/ErwhM 意味のないコードだよ
696デフォルトの名無しさん
2021/05/21(金) 14:53:16.15ID:PNtD97K1 コンパイラは別に値まで見ないからな
clippyが意味のない分岐だよと指摘してくれるのかどうかは知らんが
clippyが意味のない分岐だよと指摘してくれるのかどうかは知らんが
697デフォルトの名無しさん
2021/05/21(金) 14:55:24.20ID:HgMuIEwp >>692
基本的に条件分岐はpredがコンパイル時に評価できる場合でも true/false 両方あり得るものとして扱われるよ
その後の最適化フェーズであり得ないルートは除去されるだろうけど最適化の結果でコンパイルエラー差異が出ないようにする考え方なんだと思われる
無限ループ専用の構文であるloopが導入された背景もたぶんこのあたりにある
基本的に条件分岐はpredがコンパイル時に評価できる場合でも true/false 両方あり得るものとして扱われるよ
その後の最適化フェーズであり得ないルートは除去されるだろうけど最適化の結果でコンパイルエラー差異が出ないようにする考え方なんだと思われる
無限ループ専用の構文であるloopが導入された背景もたぶんこのあたりにある
698デフォルトの名無しさん
2021/05/21(金) 15:52:58.09ID:J6y23PLS >>697
trueのときもdrop、falseのときもdropされるとみなされるということは、
if文によってheap領域で確保しているメモリを解放するかしないか場合分けできないってことじゃん
それって不便では?
trueのときもdrop、falseのときもdropされるとみなされるということは、
if文によってheap領域で確保しているメモリを解放するかしないか場合分けできないってことじゃん
それって不便では?
699デフォルトの名無しさん
2021/05/21(金) 16:14:23.61ID:qRzkKAr2 >>698 これ元のコード見てみ
これifの条件がtrueだろうがfalseだろうがsub(&_a);は実行されるやん
ifの条件がfalseのときには問題なく実行できるけど、もしifの条件がtrueになって_aがdropされてしまった後にsub(&_a);が実行されてしまうと開放された値を使うことになる
だからRustコンパイラはエラーを吐くんだよ
これifの条件がtrueだろうがfalseだろうがsub(&_a);は実行されるやん
ifの条件がfalseのときには問題なく実行できるけど、もしifの条件がtrueになって_aがdropされてしまった後にsub(&_a);が実行されてしまうと開放された値を使うことになる
だからRustコンパイラはエラーを吐くんだよ
700デフォルトの名無しさん
2021/05/21(金) 16:15:51.92ID:91Y2FzX3 いや、普通に場合分けはできるが…
どちらかというとifの条件を変えるたびにコンパイルが通ったり通らなかったりするほうが不便では?
そこにifがあるってことは(将来的にとか何らかの条件で)実行される可能性があるからあるんでしょ
もし絶対に実行されないことが確定してるなら書く意味ないし
どちらかというとifの条件を変えるたびにコンパイルが通ったり通らなかったりするほうが不便では?
そこにifがあるってことは(将来的にとか何らかの条件で)実行される可能性があるからあるんでしょ
もし絶対に実行されないことが確定してるなら書く意味ないし
701デフォルトの名無しさん
2021/05/21(金) 16:19:22.28ID:91Y2FzX3 場合分けしたいならこんな感じで
if *_a.id == 1 {
drop(_a);
} else {
sub(&_a);
}
if *_a.id == 1 {
drop(_a);
} else {
sub(&_a);
}
702デフォルトの名無しさん
2021/05/21(金) 17:42:19.92ID:J6y23PLS >>700
言ってる意味がさっぱりわからん
>>692のプログラムにあるとおり
現実問題、将来的に決して実行されるわけがないif文というものは存在するし
if文があるというのは実行される可能性のあるの十分条件でもなければ必要条件でもなわけでもないんやが。
ワイが言いたいのは仮にrustの型システムを無視して>>692のコードをそのままコンパイルしたとしても
if文は実行されないわけだから安全なはずなものまでを省いているというところが不思議だってことや
つまりuse-after-freeバグが現実には起きないコードまでもif文の他の条件でUAFバグが起きるがために
ひとまとめにUAFが起きるとみなすrustコンパイラの姿勢がif文である条件のときだけfreeするコードを書くのを認めないようにみえるという
ワイの感想に繋がってるわけでして
言ってる意味がさっぱりわからん
>>692のプログラムにあるとおり
現実問題、将来的に決して実行されるわけがないif文というものは存在するし
if文があるというのは実行される可能性のあるの十分条件でもなければ必要条件でもなわけでもないんやが。
ワイが言いたいのは仮にrustの型システムを無視して>>692のコードをそのままコンパイルしたとしても
if文は実行されないわけだから安全なはずなものまでを省いているというところが不思議だってことや
つまりuse-after-freeバグが現実には起きないコードまでもif文の他の条件でUAFバグが起きるがために
ひとまとめにUAFが起きるとみなすrustコンパイラの姿勢がif文である条件のときだけfreeするコードを書くのを認めないようにみえるという
ワイの感想に繋がってるわけでして
703デフォルトの名無しさん
2021/05/21(金) 17:53:39.45ID:IHGXJo1X use of moved valueやborrow of moved valueを
use-after-freeとして理解してるのがそもそも間違ってる
The Bookを読んでLifetimeとOwnershipを復習してくれ
use-after-freeとして理解してるのがそもそも間違ってる
The Bookを読んでLifetimeとOwnershipを復習してくれ
704デフォルトの名無しさん
2021/05/21(金) 18:00:55.07ID:J6y23PLS >>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);
}
} 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);
}
705デフォルトの名無しさん
2021/05/21(金) 18:01:46.42ID:J6y23PLS これはrustでは弾かれるはずの「if文のある条件のときだけヒープのある部分をfree」というコードのはずだが
安全なCのプログラムや コンパイルは通るしランタイムエラーも起こさない。
メモリ安全なプログラムの中では、cで書けるプログラムのほうがrustで書けるプログラムより広いんだね
rustはメモリ安全なcのプログラムと同等な処理を書けない部分もあって不便じゃないかっていうのが結局のところワイの疑問になるんや
じゃあrustでは「if文のある条件のときだけヒープのある部分をfree」のコードをどう書くんや?
メモリ安全性を損なってるわけでもない処理ではないはずなんやがrustのコンパイラははじくぞ?
安全なCのプログラムや コンパイルは通るしランタイムエラーも起こさない。
メモリ安全なプログラムの中では、cで書けるプログラムのほうがrustで書けるプログラムより広いんだね
rustはメモリ安全なcのプログラムと同等な処理を書けない部分もあって不便じゃないかっていうのが結局のところワイの疑問になるんや
じゃあrustでは「if文のある条件のときだけヒープのある部分をfree」のコードをどう書くんや?
メモリ安全性を損なってるわけでもない処理ではないはずなんやがrustのコンパイラははじくぞ?
706デフォルトの名無しさん
2021/05/21(金) 18:03:27.13ID:J6y23PLS #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);
}
ほい完全版
#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);
}
ほい完全版
707デフォルトの名無しさん
2021/05/21(金) 18:06:23.36ID:p9FphGnI708デフォルトの名無しさん
2021/05/21(金) 18:12:17.78ID:91Y2FzX3 別にわざわざCで書いてもらわなくても安全なのは分かるよ
今のRustコンパイラで通らないのはボローチェッカーが最適化前にあるからなんで
部分的にでも先に最適化すれば通るようにはできるだろう
ただそれをしたい動機が分からない
本当にifが実行される可能性が一切ないなら単に消せばいい、といしか言いようがないので
今のRustコンパイラで通らないのはボローチェッカーが最適化前にあるからなんで
部分的にでも先に最適化すれば通るようにはできるだろう
ただそれをしたい動機が分からない
本当にifが実行される可能性が一切ないなら単に消せばいい、といしか言いようがないので
709デフォルトの名無しさん
2021/05/21(金) 18:14:06.78ID:J6y23PLS >>703
それただの論点そらしだよね
UAFってrustの独特なメモリ管理手法と相反する用語ではないし
use of moved valueやborrow of moved valueもUAFを阻止するためのものだよね
じゃあrustでは「if文のある条件のときだけヒープのある部分をfree」のコードをどう書くんや?
それただの論点そらしだよね
UAFってrustの独特なメモリ管理手法と相反する用語ではないし
use of moved valueやborrow of moved valueもUAFを阻止するためのものだよね
じゃあrustでは「if文のある条件のときだけヒープのある部分をfree」のコードをどう書くんや?
710デフォルトの名無しさん
2021/05/21(金) 18:18:59.35ID:p9FphGnI711デフォルトの名無しさん
2021/05/21(金) 18:22:54.40ID:91Y2FzX3 というか >>701 で書いたif/elseの例はちゃんと「if文のある条件のときだけヒープのある部分をfree」になっているのに何か不満なのか
712デフォルトの名無しさん
2021/05/21(金) 18:24:13.35ID:IHGXJo1X713デフォルトの名無しさん
2021/05/21(金) 18:31:38.95ID:p9FphGnI >>709
これでどうですか?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=9b05ca192ab0fd529b6de05dcc64a8c9
これでどうですか?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=9b05ca192ab0fd529b6de05dcc64a8c9
714デフォルトの名無しさん
2021/05/21(金) 18:38:40.69ID:J6y23PLS715デフォルトの名無しさん
2021/05/21(金) 18:44:49.25ID:J6y23PLS716デフォルトの名無しさん
2021/05/21(金) 19:24:50.36ID:91Y2FzX3 「理論的に安全な任意のコードは通るべき」ってイメージだったのかな
実際にはそんなことはなくて、上の例のようなコードを通すためには色々なトレードオフがあるから
単に「理論的に安全」ってだけで無条件に実装されることはない
もっと具体的なユースケースがあって、みんなが「これは通らないと不便だよね」ってなったものが実装される
数年前に実装されたnon lexical lifetimesなんかはまさにその例だね
実際にはそんなことはなくて、上の例のようなコードを通すためには色々なトレードオフがあるから
単に「理論的に安全」ってだけで無条件に実装されることはない
もっと具体的なユースケースがあって、みんなが「これは通らないと不便だよね」ってなったものが実装される
数年前に実装されたnon lexical lifetimesなんかはまさにその例だね
717デフォルトの名無しさん
2021/05/21(金) 19:31:11.66ID:bfSFy0HM はぎゃーん
718デフォルトの名無しさん
2021/05/21(金) 21:43:48.32ID:HgMuIEwp クロージャの disjoint capture が破壊的変更になるのは分かるんだけど最初からこうなってなかったのはなぜ?
719デフォルトの名無しさん
2021/05/21(金) 22:34:26.09ID:vpqVq/KA iter()とinto_iter()の使い分けが分からない
iter()じゃないといけない場合があるのは分かるんだが
iter()じゃないといけない場合があるのは分かるんだが
720デフォルトの名無しさん
2021/05/21(金) 22:49:37.59ID:+ok17UuV into_iterは所有権を奪いItemを得ることができる
iterは&Itemを得る
他のintoで始まるものは所有権を奪うことになってる
iterは&Itemを得る
他のintoで始まるものは所有権を奪うことになってる
721デフォルトの名無しさん
2021/05/21(金) 23:22:44.96ID:qRzkKAr2722デフォルトの名無しさん
2021/05/22(土) 00:04:28.82ID:yRhz4OAW >>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
Rustでの変数の受け渡し方は
by (shared) reference、by mutable reference、by valueの3つなので
それに対応していろいろなものが3種類1セットになってる
イテレータならiter(), iter_mut(), into_iter()
クロージャならFn, FnMut, FnOnce
コンバージョンならAsRef, AsMut, From/Into
723デフォルトの名無しさん
2021/05/22(土) 00:34:10.91ID:RuplHzwP as_foo(), to_foo(), into_foo() の違いも覚えておくとよいかもね
724デフォルトの名無しさん
2021/05/22(土) 00:45:11.88ID:yRhz4OAW 覚えておくとはいいのはそうだけど、そのセットは少し観点違うよね
https://rust-lang.github.io/api-guidelines/naming.html#ad-hoc-conversions-follow-as_-to_-into_-conventions-c-conv
https://rust-lang.github.io/api-guidelines/naming.html#ad-hoc-conversions-follow-as_-to_-into_-conventions-c-conv
725デフォルトの名無しさん
2021/05/22(土) 16:34:10.81ID:ma8sDMzI Rustややこしいわぁ
726デフォルトの名無しさん
2021/05/22(土) 20:26:18.21ID:UuUK8ShD Rust慣れたあと他の言語行くと
良い作法が身についてて歓迎される、とかありますか?
良い作法が身についてて歓迎される、とかありますか?
727デフォルトの名無しさん
2021/05/22(土) 20:30:50.12ID:18meLr+O728デフォルトの名無しさん
2021/05/22(土) 20:34:58.75ID:RuplHzwP rustでは変数のshadowing当たり前のように使うけど他の言語では嫌がられそう
729デフォルトの名無しさん
2021/05/22(土) 21:08:16.57ID:9BHHuuQy let value = value;
とか他言語で書いたらアホだと思われるし
とか他言語で書いたらアホだと思われるし
730デフォルトの名無しさん
2021/05/22(土) 21:10:13.17ID:61y793Zl Rustはメイン関数かその次の関数のローカル変数にリソースを保持する形にしがちじゃない?
他の言語だとあんまりやらない
他の言語だとあんまりやらない
731デフォルトの名無しさん
2021/05/23(日) 03:12:09.36ID:1TnUlIAl732デフォルトの名無しさん
2021/05/23(日) 06:28:03.88ID:ApnxiBa8 pythonみたいな動的型付け言語ではよう見るけどさ
Rustではこんなん要らなくしてほしいわ
Rustではこんなん要らなくしてほしいわ
733デフォルトの名無しさん
2021/05/23(日) 13:14:57.61ID:viOBOYhY ライブラリによってはデータを持ち運ぶということが不可能だったりするからグローバル変数必須だったりするんだよな
(具体例: serenity)
(具体例: serenity)
734デフォルトの名無しさん
2021/05/23(日) 13:33:01.51ID:1FznZ2H5 いや別に必須ではないだろ。
735デフォルトの名無しさん
2021/05/23(日) 13:39:52.69ID:p3SEnqzU log!() みたいなプログラムの各所から呼び出されるマクロや関数の実装の為には rust でも普通にグローバル変数使われているのでは
static 変数にするためには Sync が要求されたり mut にするために Mutex 使う必要があるから他の言語ほど気楽に使えないというだけで
グローバル変数そのものが禁断扱いされることはないかと
グローバル変数の濫用は他の言語同様嫌われるけどね
static 変数にするためには Sync が要求されたり mut にするために Mutex 使う必要があるから他の言語ほど気楽に使えないというだけで
グローバル変数そのものが禁断扱いされることはないかと
グローバル変数の濫用は他の言語同様嫌われるけどね
736デフォルトの名無しさん
2021/05/23(日) 13:43:31.31ID:1TnUlIAl 一般的にどんな言語においても何らかの外部のライブラリを取り込む時には
何か一つのクラスとかオブジェクトとか構造体とかに閉じ込めてしまって
それ一つだけ持ち運ぶからグローバル変数を使うことは無いでしょう
何か一つのクラスとかオブジェクトとか構造体とかに閉じ込めてしまって
それ一つだけ持ち運ぶからグローバル変数を使うことは無いでしょう
737デフォルトの名無しさん
2021/05/23(日) 16:18:03.34ID:ljEJPp90 >>735
static変数とglobal変数はスコープが違うだろ
global変数が悪とされるのは、そのスコープの広さだからね
いつどこで誰が変更するのか、また参照するのか、スコープが広ければ広いほど把握が困難になる
把握が困難になればなるほど、それだけバグを生む温床になる
static変数とglobal変数はスコープが違うだろ
global変数が悪とされるのは、そのスコープの広さだからね
いつどこで誰が変更するのか、また参照するのか、スコープが広ければ広いほど把握が困難になる
把握が困難になればなるほど、それだけバグを生む温床になる
738デフォルトの名無しさん
2021/05/23(日) 18:34:32.71ID:1FznZ2H5 io周りは極論すればどう管理してもグローバルだからな。
プロジェクト毎に規約設ける以外にまともに管理する方法なんてない。
プロジェクト毎に規約設ける以外にまともに管理する方法なんてない。
739デフォルトの名無しさん
2021/05/23(日) 20:09:32.32ID:wHpcVS8W740デフォルトの名無しさん
2021/05/24(月) 12:11:21.84ID:1Toh/2dP741デフォルトの名無しさん
2021/05/24(月) 12:28:02.03ID:wwlvG9VZ 「:?」ってなんなんですか?
https://tourofrust.com/08_ja.html
https://tourofrust.com/08_ja.html
742デフォルトの名無しさん
2021/05/24(月) 12:49:55.25ID:KKN49LSI743デフォルトの名無しさん
2021/05/24(月) 13:24:07.35ID:JJaZh5wC744デフォルトの名無しさん
2021/05/24(月) 13:33:20.21ID:u2umy7DV745デフォルトの名無しさん
2021/05/24(月) 15:43:10.46ID:dukpbHqg >>740
そのクラスの存在そのものがグローバル変数(相当)だという話?
それともそのクラスもしくはそのインスタンスをグローバル変数に入れて使うということ?
後者の意味ならば必要な範囲で引数として持ち歩けばグローバル変数を普通は使わないですよね。
そのクラスの存在そのものがグローバル変数(相当)だという話?
それともそのクラスもしくはそのインスタンスをグローバル変数に入れて使うということ?
後者の意味ならば必要な範囲で引数として持ち歩けばグローバル変数を普通は使わないですよね。
746はちみつ餃子 ◆8X2XSCHEME
2021/05/24(月) 16:59:24.57ID:tdQ8iTTE 大事なのは抽象化がきちんとしているかどうか。
各部品が妥当な意味に分離されているかどうか。
グローバル変数がよくないのは色んなパーツから横断的に使われる可能性があって
部品が不必要に密結合していることの表れだからであって、
そのグローバル変数のアクセス範囲が妥当な範囲に制御されているなら問題じゃないよ。
過剰な密結合を解消せずにグローバル変数を引数に置き換えてたら
影響範囲が見えにくくなってもっと悪くなることだってありうる。
まあどういう場合なら妥当なのかってのは色々と意見はあると思うけど。
各部品が妥当な意味に分離されているかどうか。
グローバル変数がよくないのは色んなパーツから横断的に使われる可能性があって
部品が不必要に密結合していることの表れだからであって、
そのグローバル変数のアクセス範囲が妥当な範囲に制御されているなら問題じゃないよ。
過剰な密結合を解消せずにグローバル変数を引数に置き換えてたら
影響範囲が見えにくくなってもっと悪くなることだってありうる。
まあどういう場合なら妥当なのかってのは色々と意見はあると思うけど。
747デフォルトの名無しさん
2021/05/24(月) 17:17:23.03ID:qqtJSk72 $_POSTはセーフ
748デフォルトの名無しさん
2021/05/24(月) 17:21:32.94ID:Ig527IlE >>746
まずは長くて区別しやすい名前に変えるのがスタートかね。
まずは長くて区別しやすい名前に変えるのがスタートかね。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- テレビ朝日 本社から男性が転落し死亡。関連会社社員か 当たった通行人が左肩軽傷 [阿弥陀ヶ峰★]
- テレビ朝日本社から20~30代の関連会社社員とみられる男性が転落し死亡 六本木けやき坂通りの通行人にはけが人なし [少考さん★]
- 小島瑠璃子さん、代表取締役を務める会社を破産申請 [牛丼★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
- 日本、G7への中国招待を懸念 議長国フランスに慎重な対応要請 [どどん★]
- 【サッカー】日本代表、FIFAランキング“4位”の強豪イングランドとの対戦が正式決定! 来年3月に聖地ウェンブリーで激突へ [久太郎★]
- もしかして、おまえらって俺の事をナメてる?
- 千晴におちんちん舐めてもらいたい♥
- 姉は貧乳で妹は巨乳ってパターンよくあるよな
- 【悲報】ゆうパック配達員、配達中に人妻に抱きつき無理矢理キス「好意があると思ってた」 [566475398]
- ひまだねー
- 【悲報】ジャップ、日中戦争に賛成が5割弱...軍歌の音が聞こえる... [856698234]
