Rust part10
..
720:デフォルトの名無しさん
21/05/21 18:03:27.13 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:デフォルトの名無しさん
21/05/21 18:06:23.36 p9FphGnI.net
>>705
unsafe使え、というかもうちょっと具体的な例じゃないと困る
今まで出された例だと「最初から絶対通らないの分かってるならif文消せばいい」としか思えないので
722:デフォルトの名無しさん
21/05/21 18:12:17.78 91Y2FzX3.net
別にわざわざCで書いてもらわなくても安全なのは分かるよ
今のRustコンパイラで通らないのはボローチェッカーが最適化前にあるからなんで
部分的にでも先に最適化すれば通るようにはできるだろう
ただそれをしたい動機が分からない
本当にifが実行される可能性が一切ないなら単に消せばいい、といしか言いようがないので
723:デフォルトの名無しさん
21/05/21 18:14:06.78 J6y23PLS.net
>>703
それただの論点そらしだよね
UAFってrustの独特なメモリ管理手法と相反する用語ではないし
use of moved valueやborrow of moved valueもUAFを阻止するためのものだよね
じゃあrustでは「if文のある条件のときだけヒープのある部分をfree」のコードをどう書くんや?
724:デフォルトの名無しさん
21/05/21 18:18:59.35 p9FphGnI.net
>>709
DroppableのメンバにBox<i8>持たせろ
仮に"drop"された後でもsubが正常に動くことが期待されているなら、そこで使うべきなのはdropではない
725:デフォルトの名無しさん
21/05/21 18:22:54.40 91Y2FzX3.net
というか >>701 で書いたif/elseの例はちゃんと「if文のある条件のときだけヒープのある部分をfree」になっているのに何か不満なのか
726:デフォルトの名無しさん
21/05/21 18:24:13.35 IHGXJo1X.net
>>709
UAFを阻止するためだけにあるものじゃないから
やり方は>>701で教えてくれてるやろ
とりあえずThe Book読んでね
727:デフォルトの名無しさん
21/05/21 18:31:38.95 p9FphGnI.net
>>709
これでどうですか?
URLリンク(play.rust-lang.org)
728:デフォルトの名無しさん
21/05/21 18:38:40.69 J6y23PLS.net
>>711
そうやん
rustって不思議やね
729:デフォルトの名無しさん
21/05/21 18:44:49.25 J6y23PLS.net
解決しました。
なにはともあれありがとうございました。>>701の方に救われました。
ここまで関わってくださった皆様まことに協力ありがとうございました。感謝いたします。
730:デフォルトの名無しさん
21/05/21 19:24:50.36 91Y2FzX3.net
「理論的に安全な任意のコードは通るべき」ってイメージだったのかな
実際にはそんなことはなくて、上の例のようなコードを通すためには色々なトレードオフがあるから
単に「理論的に安全」ってだけで無条件に実装されることはない
もっと具体的なユースケースがあって、みんなが「これは通らないと不便だよね」ってなったものが実装される
数年前に実装されたnon lexical lifetimesなんかはまさにその例だね
731:デフォルトの名無しさん
21/05/21 19:31:11.66 bfSFy0HM.net
はぎゃーん
732:デフォルトの名無しさん
21/05/21 21:43:48.32 HgMuIEwp.net
クロージャの disjoint capture が破壊的変更になるのは分かるんだけど最初からこうなってなかったのはなぜ?
733:デフォルトの名無しさん
21/05/21 22:34:26.09 vpqVq/KA.net
iter()とinto_iter()の使い分けが分からない
iter()じゃないといけない場合があるのは分かるんだが
734:デフォルトの名無しさん
21/05/21 22:49:37.59 +ok17UuV.net
into_iterは所有権を奪いItemを得ることができる
iterは&Itemを得る
他のintoで始まるものは所有権を奪うことになってる
735:デフォルトの名無しさん
21/05/21 23:22:44.96 qRzkKAr2.net
>>711 Rustコンパイラが問題視してるのは開放された値を使ってしまう可能性があることで、それが修正された >>701 のコードは問題ないから通る
736:デフォルトの名無しさん
21/05/22 00:04:28.82 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:デフォルトの名無しさん
21/05/22 00:34:10.91 RuplHzwP.net
as_foo(), to_foo(), into_foo() の違いも覚えておくとよいかもね
738:デフォルトの名無しさん
21/05/22 00:45:11.88 yRhz4OAW.net
覚えておくとはいいのはそうだけど、そのセットは少し観点違うよね
URLリンク(rust-lang.github.io)
739:デフォルトの名無しさん
21/05/22 16:34:10.81 ma8sDMzI.net
Rustややこしいわぁ
740:デフォルトの名無しさん
21/05/22 20:26:18.21 UuUK8ShD.net
Rust慣れたあと他の言語行くと
良い作法が身についてて歓迎される、とかありますか?
741:デフォルトの名無しさん
21/05/22 20:30:50.12 18meLr+O.net
>>726
言語が異なれば同じことをするにも良い作法とされる方法は異なるだろうし、そんなに役に立たないかもよ。
むしろRustでは〜と言い出すとかえってうるさがられる可能性も。
742:デフォルトの名無しさん
21/05/22 20:34:58.75 RuplHzwP.net
rustでは変数のshadowing当たり前のように使うけど他の言語では嫌がられそう
743:デフォルトの名無しさん
21/05/22 21:08:16.57 9BHHuuQy.net
let value = value;
とか他言語で書いたらアホだと思われるし
744:デフォルトの名無しさん
21/05/22 21:10:13.17 61y793Zl.net
Rustはメイン関数かその次の関数のローカル変数にリソースを保持する形にしがちじゃない?
他の言語だとあんまりやらない
745:デフォルトの名無しさん
21/05/23 03:12:09.36 1TnUlIAl.net
>>730
他の言語でも同じだよ
それとも禁断のグローバル変数を使う駄目パターンをRustでもしたいということ?
746:デフォルトの名無しさん
21/05/23 06:28:03.88 ApnxiBa8.net
pythonみたいな動的型付け言語ではよう見るけどさ
Rustではこんなん要らなくしてほしいわ
747:デフォルトの名無しさん
21/05/23 13:14:57.61 viOBOYhY.net
ライブラリによってはデータを持ち運ぶということが不可能だったりするからグローバル変数必須だったりするんだよな
(具体例: serenity)
748:デフォルトの名無しさん
21/05/23 13:33:01.51 1FznZ2H5.net
いや別に必須ではないだろ。
749:デフォルトの名無しさん
21/05/23 13:39:52.69 p3SEnqzU.net
log!() みたいなプログラムの各所から呼び出されるマクロや関数の実装の為には rust でも普通にグローバル変数使われているのでは
static 変数にするためには Sync が要求されたり mut にするために Mutex 使う必要があるから他の言語ほど気楽に使えないというだけで
グローバル変数そのものが禁断扱いされることはないかと
グローバル変数の濫用は他の言語同様嫌われるけどね
750:デフォルトの名無しさん
21/05/23 13:43:31.31 1TnUlIAl.net
一般的にどんな言語においても何らかの外部のライブラリを取り込む時には
何か一つのクラスとかオブジェクトとか構造体とかに閉じ込めてしまって
それ一つだけ持ち運ぶからグローバル変数を使うことは無いでしょう
751:デフォルトの名無しさん
21/05/23 16:18:03.34 ljEJPp90.net
>>735
static変数とglobal変数はスコープが違うだろ
global変数が悪とされるのは、そのスコープの広さだからね
いつどこで誰が変更するのか、また参照するのか、スコープが広ければ広いほど把握が困難になる
把握が困難になればなるほど、それだけバグを生む温床になる
752:デフォルトの名無しさん
21/05/23 18:34:32.71 1FznZ2H5.net
io周りは極論すればどう管理してもグローバルだからな。
プロジェクト毎に規約設ける以外にまともに管理する方法なんてない。
753:デフォルトの名無しさん
21/05/23 20:09:32.32 wHpcVS8W.net
>>735
そういやロガーの設定ってどこに保存されてるの?
debug!() 呼ぶたびにMutexロックしてるのかな?
754:デフォルトの名無しさん
21/05/24 12:11:21.84 1Toh/2dP.net
>>736
クラスの中に入れても、グローバル変数であることは避けられないし
どんな言語においてもグローバル変数は必要。
755:デフォルトの名無しさん
21/05/24 12:28:02.03 wwlvG9VZ.net
「:?」ってなんなんですか?
URLリンク(tourofrust.com)
756:デフォルトの名無しさん
21/05/24 12:49:55.25 KKN49LSI.net
>>741
デバッグ用のフォーマットで出力するという意味
詳しくは以下参照
URLリンク(doc.rust-lang.org)
757:デフォルトの名無しさん
21/05/24 13:24:07.35 JJaZh5wC.net
>>740
そんなことはないだろう。
確かにグローバルでも大して変わらんてものはあるけど、
loggerを引数で渡していくっていうような実装方法もある。
758:デフォルトの名無しさん
21/05/24 13:33:20.21 u2umy7DV.net
>>739
logクレートのstatic mut変数だね
ロックするのは初期化とレベル設定時だけ
出力時にロックするかどうかは実装次第
759:デフォルトの名無しさん
21/05/24 15:43:10.46 dukpbHqg.net
>>740
そのクラスの存在そのものがグローバル変数(相当)だという話?
それともそのクラスもしくはそのインスタンスをグローバル変数に入れて使うということ?
後者の意味ならば必要な範囲で引数として持ち歩けばグローバル変数を普通は使わないですよね。
760:はちみつ餃子
21/05/24 16:59:24.57 tdQ8iTTE.net
大事なのは抽象化がきちんとしているかどうか。
各部品が妥当な意味に分離されているかどうか。
グローバル変数がよくないのは色んなパーツから横断的に使われる可能性があって
部品が不必要に密結合していることの表れだからであって、
そのグローバル変数のアクセス範囲が妥当な範囲に制御されているなら問題じゃないよ。
過剰な密結合を解消せずにグローバル変数を引数に置き換えてたら
影響範囲が見えにくくなってもっと悪くなることだってありうる。
まあどういう場合なら妥当なのかってのは色々と意見はあると思うけど。
761:デフォルトの名無しさん
21/05/24 17:17:23.03 qqtJSk72.net
$_POSTはセーフ
762:デフォルトの名無しさん
21/05/24 17:21:32.94 Ig527IlE.net
>>746
まずは長くて区別しやすい名前に変えるのがスタートかね。
763:デフォルトの名無しさん
21/05/24 17:31:54.98 wwlvG9VZ.net
>>742
ありがとう!
764:なんか独特なのね
765:デフォルトの名無しさん
21/05/24 23:12:37.25 rI3Y4Uqa.net
関数型言語やったことないけど、Rustいけるかな
JavaとC++はそこそこ経験あり
766:デフォルトの名無しさん
21/05/24 23:17:37.88 zk4LoLUU.net
Java 8とかC++ 14以降くらいなら結構似たような機能も入ってるし
そこまで大変じゃない気がする
767:デフォルトの名無しさん
21/05/24 23:36:00.17 JJaZh5wC.net
c++はともかく、cくらいはやっぱ理解してた方が早道な気はする。
768:デフォルトの名無しさん
21/05/25 01:36:21.07 5vUI50kp.net
以下のような関数を作ったんですがmatchが多くてどうしようか考えていました
fn foo(x: Option<u32>, y: Option<&str>) { //実際はOptionが5個とか
let x = match x {
Some(x) => x,
None => return,
};
let y = match y {
Some(y) => y,
None => return,
};
println!("{} {}", x, y);
}
考えついたのが、次のようにする方法なのですが、
fn foo(x: Option<u32>, y: Option<&str>) -> Option<()> {
let x = x?;
let y = y?;
println!("{} {}", x, y);
Some(())
}
記載の省略のためだけに返値の型をOption<()>にして最後にSome(())つけるのがすごく気持ち悪いんですが、
返値なしのままどうにかする方法はないでしょうか
769:デフォルトの名無しさん
21/05/25 02:11:48.11 QcInQ0e9.net
if_chain使って
if_chain!{
if let Some(x) = x;
...
then { println!("{}", x); } }
770:デフォルトの名無しさん
21/05/25 02:16:51.35 Ygc8ZzR1.net
>>753
fooの型変えられないなら、戻り値Optionはクロージャないしローカル関数に留めるといいと思う
URLリンク(play.rust-lang.org)
771:デフォルトの名無しさん
21/05/25 03:00:10.05 nrKC74iS.net
Ok(())はよく使うがSome(())はないな
普通にif-letでパターンマッチするのでよくない?
if let (Some(x), Some(y)) = (x, y) {
println!("{} {}", x, y);
}
772:デフォルトの名無しさん
21/05/25 05:18:39.47 gz717nup.net
loggerを引数で渡すためには
ロギングを行うクラスFooがどこかしら(コンストラクタか個々のメソッドで)loggerを受け取る引数を持たねばならない
これ、ロギングみたいな裏方の仕事がFooのインターフェース仕様に影響しているということで、
抽象度が下がってるやんけ;;;
引き換えに得られるメリットは、Fooのインスタンスごとにloggerを切り替えられるというおおよそ現実的にありがたみが無い機能だけ
773:デフォルトの名無しさん
21/05/25 06:08:48.35 FYPKUk3M.net
>>756
それをmachでやるのがよくない?
774:デフォルトの名無しさん
21/05/25 06:23:40.79 gz717nup.net
つか機能の分離と記述の分離はトレードオフがある
1+1=2の形式的証明がどんだけの糞みたいな分量のに成り得るかを見たらワカル
どっかの抽象度をつきつめれば別のところにしわ寄せが逝く
それで良いジャマイカ人間の言語だもの、
775:デフォルトの名無しさん
21/05/25 09:01:56.56 5vUI50kp.net
皆様ありがとうございます
どうもSomeをある程度書くのは避けられない感じですね
776:デフォルトの名無しさん
21/05/25 10:09:28.07 4oEEOZjA.net
まさかstatic変数使ってるなんて、logクレートには失望したわ
777:デフォルトの名無しさん
21/05/25 10:33:41.89 bGIV0Xp5.net
>>757
ログを裏方と考えるのも偏ってるし、ログ切り替えはデバッグ目的で普通にあるわ。
別にグローバルにするという選択が間違いとも思わんがこういう決めつけ野郎は邪魔だな。
778:デフォルトの名無しさん
21/05/25 10:59:01.14 /nQyXsn+.net
サーバ側だとログを取るのが基本だし取り方も変えたくなるからlogger渡しは結構やるな
CLIとかなら雑にstaticでいいけど
779:デフォルトの名無しさん
21/05/25 13:12:03.88 CssgwvqL.net
>>761
stdも使えないじゃん
780:デフォルトの名無しさん
21/05/25 18:48:30.58 4oEEOZjA.net
>>764
なんで?
781:デフォルトの名無しさん
21/05/25 19:25:41.69 CssgwvqL.net
>>765
URLリンク(github.com)
782:デフォルトの名無しさん
21/05/25 19:39:28.48 4oEEOZjA.net
>>766
えー
これからは write() システムコールでプリントするわ
783:デフォルトの名無しさん
21/05/25 21:02:03.28 p1A5R6d8.net
stdが嫌ならcoreを使え
784:デフォルトの名無しさん
21/05/25 22:59:34.15 gz717nup.net
>>762
近代的なログシステムならタグが使えるから
記録時に分っける理由がさらさらない
だいたい並列な事象を並列なまま記録したのでは時系列の解析ができないし、
そもそも>>762がいくら「ログは裏方じゃない」と叫んだところで基準が無い
アプリケーションロジックを汚してまでか?!という議論はいつまでもつきまとう
785:デフォルトの名無しさん
21/05/26 00:00:47.75 S2nFrW0F.net
別に仕事で使ったことないならそういえばいいと思うよ。悪いことしてるわけじゃないんだから。
786:デフォルトの名無しさん
21/05/26 00:04:47.15 PLorGv/T.net
そういやLog4JでいうMDCみたいなやつはあるのかしら?
787:デフォルトの名無しさん
21/05/26 00:07:56.89 rwxZHBm1.net
お前らslog
>>760
ただのzipやん。
URLリンク(play.rust-lang.org)
788:デフォルトの名無しさん
21/05/26 08:19:13.92 AN5OxrIl.net
まあloggingオブジェクトを複数作る仕事なんなら仕方が無いな
789:デフォルトの名無しさん
21/05/26 08:29:19.07 vJAmL6Qi.net
slog見たけど、クソややこしいな
790:デフォルトの名無しさん
21/05/28 09:51:25.19 jQHjx/Sg.net
シンタックスで判断しづらいもので性的分析するって、そのうち破綻しそうだな。
791:デフォルトの名無しさん
21/05/28 09:54:11.42 S8Iz9SRl.net
エロい分析か
792:デフォルトの名無しさん
21/05/28 10:45:17.68 EKMYAKDR.net
やらC
793:デフォルトの名無しさん
21/05/29 20:28:41.06 sKXDX7XX.net
JPEG-XLのリファレンス実装作ってるチームがRustで再実装も始めてて驚いた
URLリンク(github.com)
FirefoxにJPEG-XL対応を入れるかどうか議論するチケットで
今更大量のunsafeなC++コードを入れるのはちょっと……みたいな反応をされてた事と関係あるのかもしれない
794:デフォルトの名無しさん
21/05/30 15:56:56.42 HupJBx7X.net
URLリンク(4e6.github.io)
URLリンク(www.openhub.net)
Firefox、かなりの割合でC++のコード入ってるけどこれでも減らそうとしてるのか
795:デフォルトの名無しさん
21/05/30 16:00:13.57 P46Jh5T1.net
もう9.5%も行ってるのか
と言うかfirefoxからrustは始まったから当然か
796:デフォルトの名無しさん
21/05/30 16:15:38.02 ds+xAsBi.net
でも、大量の有名なWebサービスが一時的にRubyで書いていたのに、
しばらくすると他言語に書き直した歴史がある。
アメリカ人はなぜか言語を書き直すのが好きなようだ。
Rustで書いてもまた別言語に直すかも知れない。
なお、Googleドライブなどの各社のストレージサービスを統一的なAPIで制御できる
ライブラリも何故かGoで書かれている。
メンドクサイ。
797:デフォルトの名無しさん
21/05/30 17:11:41.17 cF4puvJq.net
>>781
遅い方から速い方へ書き直すのよ
特にスクリプト言語からC++/Rustへ書き換えるとサーバー数を1/10にできるケースもあり規模によっては経費激減ね
GoもGCあるから場合によっては他へ書き換えられる対象になりうるかも
Rustが他へ書き換えられる可能性がもしあるとしたら今はまだ存在しない新たに出現する言語へ
798:デフォルトの名無しさん
21/05/31 00:35:54.04 7s+MSAY0.net
なんでClippy大先生がcargoでインストールできるクレートから外されるの?
799:デフォルトの名無しさん
21/05/31 01:50:13.82 u1BqTaEs.net
rustupでインストールできるからでは
rustcとバージョン合わせないといけないから他のcrateと同じ扱いはしづらいのでは
800:デフォルトの名無しさん
21/05/31 08:44:19.92 etoumxTf.net
Ruby on Rails の時価総額は、
Shopify が15兆円、
民泊のAirbnb が、大手ホテル3社の合計以上の10兆円、
Github が8千億円
これぐらい巨大でも、Rails で出来る。
時価総額が千億円以上になったら、Go, Elixir を考えてもよい
食べチョクは売上50億円らしいけど、
若い文系女が1人で起業したような会社は、Rails で十分
売上が千億円を超えたら、考えてもよい
801:はちみつ餃子
21/05/31 15:24:48.93 hqkxpUd6.net
ウェブシステム全体の実行コストはネットワークや IO にボトルネックが有るので
システム構成やらなんやらで工夫するのがまずやることで、
言語の速度が少しばかり速いのはそんなに効いてこないよ。
という話もよく聞くんだけど、実際のところどんなもんやろね?
802:デフォルトの名無しさん
21/05/31 16:31:16.04 slsuSMsk.net
そりゃそうね
でも実行速度だけで選ぶわけじゃないからね
803:デフォルトの名無しさん
21/05/31 19:40:04.29 mBUAbPrR.net
今まではハードにぶん投げても大丈夫だったのが
ハードの進化の鈍化でソフト側が工夫しないと駄目になりつつあるって話ってマジ?
804:デフォルトの名無しさん
21/05/31 21:37:16.00 M7WLmn8V.net
いやそこでソフトで頑張ってもほぼダメだろ。。アーキテクチャで分散化考えないとって話じゃないかね
805:はちみつ餃子
21/06/01 01:05:37.48 69wa4c/Y.net
>>788
ハードウェアがもう伸びないってことではなくて、 CPU の速度が単純に速くなるという方向ではもう伸びにくいって話。
電子の大きさは変えられないから際限なく微細化できるわけではない。
わかりやすい例で言えば今のパソコンはマルチコアが当たり前になってて複数の CPU を載せる方向で性能を上げているが、
マルチコアを想定してないソフトをマルチコアパソコンで動かしてもひとつのコアしか使わないので性能が出ない。
高価な GPU を乗せても GPU を使うプログラムになってなきゃ意味がない。
ハードウェアの総合的な性能を上げるには色んな工夫があり得て、それらを実現すると同時に
ソフトウェアは「ハードウェアに合わせて」「ハードウェアの性能を引き出すように」工夫がいる。
これは今までにも普通にやってたことで、今になって必要になったわけじゃない。
小さな変化の積み重ねなこともあれば大きな変革を迫られることもあるってだけ。
806:デフォルトの名無しさん
21/06/01 07:44:50.11 DWqq5xbS.net
後藤弘茂のWeekly海外ニュース■ Prescott/Tejasは5GHz台、65nmのNehalemは10GHz以上に
URLリンク(pc.watch.impress.co.jp)
当時は景気よかったっすね。すぐ後に爆熱で日和ったけど
そして今、300Wの時代・・・
てか並列化によるスループットの向上はこのあたりから検討されるようになっていた気が
807:デフォルトの名無しさん
21/06/01 19:29:09.48 a3oi+h5L.net
>>784 でも何故かcargoだけはcargo install cargo --forceとすれば自分でコンパイルしたもので上書きができる謎
808:デフォルトの名無しさん
21/06/04 15:33:30.83 kJqxa98Z.net
よくわからないんだけどこれ、C言語のポインタ渡しが諸悪の根源で、そこを断ちさえすればC言語も所有権概念を取り入れられるの?
809:デフォルトの名無しさん
21/06/04 15:42:09.57 03MQShFS.net
>>793
C言語において、ポインタは大発明で、それによってリンクリストやツリー構造
が簡単に実装に出来る様になった、大変重要なもの。
C言語からポインタを絶てば何も残らない。
810:デフォルトの名無しさん
21/06/04 15:48:43.92 1/rRer4v.net
Javaキチガイはポインタ使いこなせない
日本のMSの社員がソレだった
破棄忘れてやんのw
811:デフォルトの名無しさん
21/06/04 15:55:06.60 JfDLBnT5.net
RAIIなしで良いなら多少の拡張で所有権の概念取り込めるかも知れないけど
絶対スマートポインタ欲しくなるしCの表現力だと使いづらい物になりそうな気がする
812:デフォルトの名無しさん
21/06/04 16:03:03.62 KjgiO9jk.net
>>794
>C言語において、ポインタは大発明
笑笑
813:デフォルトの名無しさん
21/06/04 17:24:32.39 Lunsq3fv.net
Cと比較するのは流石に乱暴だろ
C++と比較するべき
で、C++でできなくてRustでできるものというのは現状存在しない (今後その差も埋まっていくだろうが)
C++とRustの違いはひとえにスタンスの違いだよ
自由奔放なC++か良いコードにカッチリ導いてくれるRustか
意欲的に新機能取り込んで発展してるのは両者とも同じ
814:デフォルトの名無しさん
21/06/04 17:31:18.17 AGlHvwIO.net
>>798
>C++でできなくてRustでできるものというのは現状存在しない
こういう比べ方はアホ
チューリング完全ならなんでもできるじゃんみたいなことになる
できるできないの線引きが恣意的
815:デフォルトの名無しさん
21/06/04 17:54:18.33 7u0nl5aT.net
>>799
バカアホじゃなくて、Rustでしかできないものの例を挙げてください
そうすれば一単語で反論の余地なく終わるんで
816:デフォルトの名無しさん
21/06/04 17:58:01.49 UUHTR6cx.net
C++は奇麗に描くと言うのが出来ない
817:デフォルトの名無しさん
21/06/04 18:03:48.84 Pwqe5Yy7.net
>>800
C++でできなくてRustでできるもの
から
Rustでしかできないもの
への華麗な転身www
818:デフォルトの名無しさん
21/06/04 18:16:57.72 hlBLv8XD.net
C++はMemory Safetyをコンパイル時に担保できない
Rustを使う一番の動機
819:デフォルトの名無しさん
21/06/04 18:53:59.58 nHzCWsfU.net
>>802 C++とRustの比較において「C++でできなくてRustでできるもの」と「Rustでしかできないもの」は同じ意味だから転身でもなんでもない
URLリンク(i.imgur.com)
820:デフォルトの名無しさん
21/06/04 19:11:16.95 s8nyhwnD.net
Cloudflareの画像処理責任者を名乗る人も、これ以上C++ライブラリを増やすのはイヤでござると発言してるな
821:デフォルトの名無しさん
21/06/04 19:23:30.63 4pNcWBF2.net
>>804
C++とRust以外にも言語はたくさんある
822:デフォルトの名無しさん
21/06/04 19:29:23.53 nsxzushh.net
Rustのモジュール(ファイル分割)の仕組みはC++のヘッダー+ソース(+名前空間)より扱いやすいと思う
C++は分割コンパイルが主流だった歴史的経緯があるから仕方ないけど事前の宣言が必要なのは地味に面倒くさい
823:デフォルトの名無しさん
21/06/04 19:43:15.38 nHzCWsfU.net
>>806 この会話の流れではC++とRustの比較をしていたから
824:デフォルトの名無しさん
21/06/04 19:58:10.76 4pNcWBF2.net
ライフタイムによるメモリ管理はRustオンリーだろ
825:デフォルトの名無しさん
21/06/04 20:12:39.71 s8nyhwnD.net
マイナーな環境だとC++プログラムは様々な理由でコンパイルが通らないことがよくある
Rustは基本的にはそういう事ないし、コンパイラ実装が一つしかないというのも利点に働く
826:デフォルトの名無しさん
21/06/04 20:40:42.82 CpdoeubZ.net
C++との比較を議論したいなら専用の隔離スレでどうぞ
827:デフォルトの名無しさん
21/06/04 22:02:04.46 ivUqItUs.net
>>793は言語レベルのサポートがほしいんだろ?
substructural type systemがないと無理。
>>809
MLkit,RTSJ,cyclone,ATS/ATS2。学術的にはとっくの昔に廃れたぞ。
828:デフォルトの名無しさん
21/06/04 22:04:58.58 yXI/MC9G.net
WinUIとRustやってる人いる?
同じネイティブのMFCとかと比べて、やっぱり生産性は高いんかな
829:デフォルトの名無しさん
21/06/04 22:26:52.09 I1RVdPKQ.net
メモリ関連って原因不明のバグ引き起こしやすいしトータルな目で見れば上がるんじゃないだろうか
830:デフォルトの名無しさん
21/06/04 23:27:29.47 JfDLBnT5.net
>>810
gcc-rsとかのプロジェクト始まってるけどそれはネガティブなことなのかね
831:デフォルトの名無しさん
21/06/05 06:04:54.16 uC9Joojh.net
>>810
そういえば、C++のSTLは、VSでは動くが、BSD系のLLVM用のlibc++は、
なかなか上手く動いてくれない。理由は、libc++が、その
基礎関数として滅多に使われないようなMB・WC文字変換関連や、
NAN、INFINITYなどのfloat/double調査関数など、昔ながらのC環境では
定義されて無いような(新しい)Cの関数を大量に必要としているため。
その意味で、WasmのWASIなんかは、たとえCUIだけであっても
世界共通の関数群を整備してくれるのだとしたら有りがたいかも知れない。
でもWASI自体の移植作業が必要になるから一緒か。
832:デフォルトの名無しさん
21/06/05 06:14:19.54 uC9Joojh.net
>>816
昔からCには文字種判別として、isalphaやisdigitなどがあるが、
libc++は、isalpha_l()などのlocale指定タイプを必要としていたりして
locale関連がやたらと複雑。また、その
isalpha_lなどを基礎にしてくれているならまだしも、isalpha_lが内部で使っている
文字種テーブル unsigned short _ctype[256]; も仮定していたりする。
このテーブルは、_CONTROL、_SPACE、_DIGIT、_ALPHAなどの
BIT定数とandを取ってBITが立っているかどうかで文字種を判定する。
それは環境依存なのだが、高速化のためか何故かそれを必要としている。
(C++のライブラリが欲しいのに、そのライブラリが、なぜか一般的ではない
大量のC関数や特殊なデータテーブルを必要としてしまっている。)
だから移植が進まない。
plain Cは、標準ライブラリが多くの環境である程度の互換性を持って整備されているが、
結果的にC++のSTLはなかなかそうではないようだ。
833:デフォルトの名無しさん
21/06/05 06:17:47.83 uC9Joojh.net
C++ライブラリがisalpha_lなどを用いてしまったら、速度面でC#やJavaなど
に比べた優位性が少なくなってしまうからかも知れない。
つまり高速化のためにやたらと移植性の低い方法を使っているから、
スムーズに移植が進まない。
それか単純にC++ライブラリを作る人の技術力が低いからだろうか?
834:デフォルトの名無しさん
21/06/05 06:20:08.28 uC9Joojh.net
>>801
すまんが、Rustはもっと出来ない気がする。
835:デフォルトの名無しさん
21/06/05 09:02:04.60 KdS0cXcP.net
RustスレでC++の話題が出てしまうのはもはや運命なのか
836:デフォルトの名無しさん
21/06/05 09:20:03.77 3ILRB2eH.net
>>820
そりゃ better C++言語として作られたんだから当たり前でしょう
837:デフォルトの名無しさん
21/06/05 09:32:35.80 4o2YwJP1.net
ライフラインの書き方がとにかく見づらい
838:デフォルトの名無しさん
21/06/05 09:45:07.09 3ILRB2eH.net
これヤバくない?
どうやって防いだらいいんだろう?
URLリンク(github.com)
839:デフォルトの名無しさん
21/06/05 09:46:58.65 4o2YwJP1.net
localhostに送るだけならいくないん?
840:デフォルトの名無しさん
21/06/05 09:53:33.78 3ILRB2eH.net
え、マジで言ってるの?
841:デフォルトの名無しさん
21/06/05 10:04:24.16 4o2YwJP1.net
あおられてもダメな理由がわかりまそん
びっくりはするけど
842:デフォルトの名無しさん
21/06/05 11:21:46.59 KdS0cXcP.net
悪意を持ったコードをビルドしない
843:デフォルトの名無しさん
21/06/05 12:04:01.08 bvIfRQLF.net
c++との比較はガファムが結論出してくれたからもう話すことなどない
844:デフォルトの名無しさん
21/06/05 12:08:54.56 85+uBK5B.net
何をみて結論だと思ってんだか。短絡的だな。
845:デフォルトの名無しさん
21/06/05 12:26:06.61 YTe/4gPS.net
依存するクレートの依存するクレートの依存するクレートの以下無限ループまで全部チェックしないと駄目ー?(´・ω・`)
846:デフォルトの名無しさん
21/06/05 12:58:14.11 KdS0cXcP.net
チェックするツールとか誰か作っていそうだね
バイナリを診断するよりは簡単だろうし
847:デフォルトの名無しさん
21/06/05 13:57:18.40 IMH8ctkE.net
>>826
念のためマジレスすると公開した人がいつでもlocalhostを〇国サーバーのアドレスに書き換えられるってこと
githubのオープンソースでそれやったらすぐにばれそうだけど
ビルド時ならともかくエディタ起動直後のコード解析でデータが送信されるのは盲点やね
848:デフォルトの名無しさん
21/06/05 14:01:47.49 f5S9H8yw.net
ビルドしなくてもファイルを開いたらコードが実行されるというのはよろしくないね
ファイルやネットワークならアクセスされる側でブロック可能だけど
メモリはサンドボックス内のみで展開・実行されるようにしないとブロックできない気がする
サンドボックス化できなければ
cargo auditやcargo crevを通して怪しいcrateだけ自分でチェックするとかかな
849:デフォルトの名無しさん
21/06/05 14:06:05.14 KdS0cXcP.net
vscodeやlspヤバイな
850:デフォルトの名無しさん
21/06/05 14:13:31.58 8YO6sBC6.net
解決方: vscode を使わない
851:デフォルトの名無しさん
21/06/05 14:27:34.92 4o2YwJP1.net
まったくだ
852:デフォルトの名無しさん
21/06/05 14:48:29.61 uV7DnhUL.net
見た感じVSCode以外でもマクロが実行されるようなことをすると駄目っぽいが
853:デフォルトの名無しさん
21/06/05 14:52:35.33 4o2YwJP1.net
MS自身がやりたい放題だからメンタルも伝播するだろうな
854:デフォルトの名無しさん
21/06/05 15:03:58.08 85+uBK5B.net
>>835
それrust使わなけりゃでも良くね?
855:デフォルトの名無しさん
21/06/05 15:09:20.73 uV7DnhUL.net
そもそもこれ本質はライブラリの信頼性って問題だと思うんだよな
Rustだけじゃなく他の言語にも言える話
856:デフォルトの名無しさん
21/06/05 15:22:11.73 85+uBK5B.net
お得意の静的チェックでなんとかしたら?
857:デフォルトの名無しさん
21/06/05 15:29:47.09 KdS0cXcP.net
中国のipアドレスは
858:全部ブロックしておくのが正解だな
859:デフォルトの名無しさん
21/06/05 15:51:07.65 3ILRB2eH.net
IntelliJ/CLion でもproc_macro実行されちゃうの?
860:デフォルトの名無しさん
21/06/05 16:11:56.77 Fi/fLauk.net
LSPはクソ
vscodeありきの思想
861:デフォルトの名無しさん
21/06/05 16:32:08.49 6EguRj/L.net
LSPってHSPの親戚ですか?
862:デフォルトの名無しさん
21/06/05 16:43:48.73 KdS0cXcP.net
long short play モードだよ
863:はちみつ餃子
21/06/05 16:56:48.31 G0EcoOQC.net
>>844
LSP はエディタとの連携を前提として明文化された規格にしたってだけで、
処理系にコンパイルさせた結果をエディタの表示に反映させるというのは昔から有ったんだぞ。
864:デフォルトの名無しさん
21/06/05 17:38:04.49 ftrSVS/I.net
>>847
> 処理系にコンパイルさせた結果をエディタの表示に反映させるというのは昔から有ったんだぞ。
いやそりゃそうだろ
その説明じゃ flycheck 等と差がない
865:はちみつ餃子
21/06/05 18:00:21.39 G0EcoOQC.net
>>848
Rust のコードをビルドしないときでもエディタ経由で勝手にビルドする
(そのときに悪意のあるコードも走らせられるかもしれない)
という文脈の中で >>844 の発言があったので、
それは LSP が作られる前から同じような危険性はあっただろうという反論を私はしたつもり。
LSP のせいじゃなくてコンパイル時に出来ることが多い Rust のせいって話。
866:デフォルトの名無しさん
21/06/05 18:09:21.84 Fi/fLauk.net
はあ話になんね
こいつといいQZといい「何か物申したい」という気持ちだけで生きてるから常に空回ってんだよな
867:デフォルトの名無しさん
21/06/05 18:52:13.97 ZTm581Ue.net
proc-macroがwasm化されてサンドボックスで動くようになればマシになるのかね
そもそも怪しいコードが依存関係に混入しちゃう時点でcargo runなりtestなりしたらなにされるかわからん訳でproc-macroの件自体にどれくらいの影響度があるのかは分からんが
868:デフォルトの名無しさん
21/06/05 19:44:30.63 uV7DnhUL.net
crossでx86_64-unknown-linux-gnuをtargetにクロスコンパイルしたらいいんじゃないか?
あれ確かDockerで動いてたはず
869:デフォルトの名無しさん
21/06/05 19:45:33.78 uV7DnhUL.net
自分のPC向けにクロスコンパイル用ツールを使ってコンパイルするのがクロスコンパイルというかどうかは知らんけど
870:デフォルトの名無しさん
21/06/06 08:03:37.51 W7azs2BY.net
>>823
特定のエディターの問題ではなく
特定のプログラミング言語の問題ではなく
自分が意図していない自動マクロ(プラグイン)を使えば自分が意図していない動作をするだけの話
大昔からあらゆる環境で起きていること
871:デフォルトの名無しさん
21/06/06 09:39:11.50 3IIg9tuB.net
コーディング時、ビルド時になんでもやらせようって発想が間違ってんだよ。
872:デフォルトの名無しさん
21/06/06 10:03:07.57 mKFU6ep6.net
マクロはやっぱ悪よな、無いと辛みが増すから仕方ないじゃなくて無くても何とか出来る仕様にすべき
873:デフォルトの名無しさん
21/06/06 10:25:40.41 W7azs2BY.net
今回の>>823の問題に限っていえば
そもそもLSPを使う人のためのプラグインなのだからLSPのlocalhost:8080に接続に行くことは何の問題もないよね
問題としているのはSSHの秘密鍵をそこへ自動送付していること
LSPそこまで詳しくないのだけどそれはどうしても必要なことなの?
874:デフォルトの名無しさん
21/06/06 10:32:40.20 MV541K/D.net
LSPは、この騒動(?)と関係なくクソ
875:デフォルトの名無しさん
21/06/06 10:33:23.63 MV541K/D.net
快適なエディタと快適なIDEの区別がつかなくなったバカどもがゴリ押しで流行らせてる
876:デフォルトの名無しさん
21/06/06 11:08:51.30 n+sQSuEO.net
>>857
>LSPのlocalhost:8080に接続に行くことは何の問題もないよね
localhost:8080はLanguage Serverじゃないよ
877:デフォルトの名無しさん
21/06/06 11:16:22.93 W7azs2BY.net
>>860
それはすまなんだ
じゃあ何が問題になってるのかな
878:デフォルトの名無しさん
21/06/06 12:13:20.98 xB3z9vbi.net
>>861
LSPをセットアップした状態だと「VSCodeを起動しただけで」自動ビルドが走ってしまって悪意あるprocedural macroが実行されてしまうこと
手動でビルドすれば同じことになるのでそこは問題の本質じゃなくね?とは思う
879:デフォルトの名無しさん
21/06/06 12:48:13.98 V+UU2WI7.net
LSPというよりrust-analyzerやrls、cargo/rustcの問題と言った方が正確かな
880:デフォルトの名無しさん
21/06/06 14:24:19.60 W7azs2BY.net
では>>823で指摘されている問題点「自分のSSHの秘密鍵が勝手に読み出されて送信される」はどの部分がその動作を要求しているの?
本当に必要な動作なの?
881:デフォルトの名無しさん
21/06/06 14:29:37.79 LOfpkHxA.net
手続きマクロの展開なのでcargo checkでも起こり得る
言ってしまえばRustの言語仕様そのもの
解決策は>>851の言うようにサンドボックス化するみたいな方法しかなさそう
882:デフォルトの名無しさん
21/06/06 14:35:16.58 n+sQSuEO.net
>>861
macroをexpandする時に
macroの定義に書かれてる任意のコードを実行することができるって話
任意のコードの例としてSSHのキーをサーバーに送信する例が書かれてて
試す人に無害なように送信先サーバーはlocalhostになってるだけ
コード見たほうが早いかも
make_answer!がexpandされるときにread_ssh_keyが実行される
URLリンク(github.com)
883:デフォルトの名無しさん
21/06/06 14:40:17.63 3IIg9tuB.net
このコード例はめちゃくちゃわかりやすい。問題は置いといてgoodなコードだ。
884:デフォルトの名無しさん
21/06/06 15:22:49.77 fghVy2Pw.net
crate-typeがproc-macroのときはffiを禁止して使用可能なextern crateを
安全性が保証されたものだけに制限するのがRustっぽいかな
proc-macro専用のstdが必要になるけどno_stdと同じ感覚でmacro_safe属性をつければいい
885:デフォルトの名無しさん
21/06/06 16:06:34.14 xR3kS6+v.net
そもそも普通はproc-macroなんか必要ないだろ
特殊用途以外では一律禁止してよいのでは?
886:デフォルトの名無しさん
21/06/06 16:20:07.52 V+UU2WI7.net
derive が使えなくなるのは結構困る
887:デフォルトの名無しさん
21/06/06 23:45:39.31 xQoKsnFB.net
>>843
マクロ展開すればどんな環境でもできるよ。
>>823はmulti-root workspaceの構成間違ってるから
IntelliJRustだとマクロ展開されないけど。
>>869
custom derive全部禁止だから当然thiserrorもserdeもdelegation系も禁止な。
ボイラープレート全部手書きしろよ。
888:デフォルトの名無しさん
21/06/07 06:02:10.08 k/PpyTws.net
頭悪い奴らばかりで議論にならぬ
趣旨と仕組みはreadme書いてあるのに。。
889:デフォルトの名無しさん
21/06/07 13:37:53.63 BQ22AOvo.net
今勉強中なんだけど、Rustと合わせた時のgdbの使い方を教えてくれんかな
行指定でb main.rs:10みたいにブレイクポイントを指定するのってどうやるの?
>No source file named main.rs.
みたいに言われてしまって、どうやって行指定でブレイクポイントを設定するのかよくわからん
ソースのあるディレクトリがわからないのかと思って指定しても結果は変わらず・・・・
あと、ソースを表示しながらステップ実行したりってどうやるの?
890:デフォルトの名無しさん
21/06/07 13:52:39.17 C46sPHOc.net
vscodeでcodelldb使おう
891:デフォルトの名無しさん
21/06/07 14:06:08.51 BQ22AOvo.net
ああ、デフォルトで-gつかないのか・・・・
でもlldbが主流っぽいし、それ使うかな
892:デフォルトの名無しさん
21/06/07 14:34:12.65 VGLcnon2.net
macのgdbだと今はまともに動かんぞ。
893:デフォルトの名無しさん
21/06/07 14:45:09.07 OvPzoGrd.net
M1になって
894:macの開発環境死んだ
895:デフォルトの名無しさん
21/06/07 15:56:52.66 D0MWfzjy.net
iPhone開発でMac必須になったことで強気に出すぎたか。
Macは滅びると思っていたらx86系になってからなぜかしぶとく生き残ってきたけど、
もうだめかもな。
896:デフォルトの名無しさん
21/06/07 16:08:45.47 BQ22AOvo.net
lldbを試しに使ってみてるんだけどさ
これって、ステップ実行するたびに自動で毎回「memory read --size 8 --format x $sp」をやってもらうことってできないの?
gdb-pedaを使っていたときはスタックの中身が自動で見れてたんだけど、なんか似たようなのないのかな?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
414日前に更新/267 KB
担当:undef