Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

コマンドライン引数でサーバーのソケットアドレスを変更できるようにした #20

Merged
merged 5 commits into from
Jan 14, 2025

Conversation

sarukiti
Copy link
Contributor

@sarukiti sarukiti commented Jan 14, 2025

概要

タイトルの通りです.

@sarukiti
Copy link
Contributor Author

30caeffでUnstable Rustの機能であるlet_chainsを使っていましたが,似たようなコードでStable Rustにできることに気付いたのでそっちで実装しました.
ただ,Rust 2024で近いうち有効になるこの機能を使えば結構エレガントにこの部分のコードを書き換えられます.Stableになり次第そうするつもりです.

let socket_address = if args.get(1).is_some()
&& args[1].parse::<std::net::SocketAddr>().is_ok()
{
args[1].parse().unwrap()
} else {
const DEFAULT_ADDRESS: &str = "127.0.0.1:50051";
DEFAULT_ADDRESS.parse().unwrap()
};

↓これが

let socket_address = if let Some(str) = args.get(1)
    && let Ok(addr) = str.parse::<std::net::SocketAddr>()
{
    addr
} else {
    const DEFAULT_ADDRESS: &str = "127.0.0.1:50051";
    DEFAULT_ADDRESS.parse().unwrap()
};

こう

@sarukiti
Copy link
Contributor Author

sarukiti commented Jan 14, 2025

ちなみに,上記のどちらのコードもプログラマの責任によって絶対に実行時エラーを起こさないことが保証できます.ここでは,6326f1bのコードを例に説明します.
まず55-56行目.Vecに[1]でアクセスしていて危険だと思われるかもしれませんが,安全なんです.
if文の条件式の評価は,前から順番に行われます.つまり,args.get(1).is_some()の評価が終わってからargs[1].parse().is_ok()の評価に入るわけです.
args.get(1).is_some()の評価の結果がfalseだった場合,つまりargs[1]が範囲外アクセスになるかもしれない場合は,args[1].parse().is_ok()の評価をすることなく59行目に飛びます.よってここは安全です.
58行目.parse()の結果をunwrap()していますが,大丈夫です.なぜなら,56行目でargs[1].parse()の結果がOkであることを確認していますからね.
61行目のunwrap()は,DEFAULT_ADDRESSがちゃんとparseできることをプログラマがきちんと確認しておけば安全です.
よって,このコードは安全であることを証明できました.
Unstableの方のコードも,同様に安全であることが確認できるはずです.むしろ,straddrも型安全であることが一目瞭然だと思います.

if args.get(1).is_some() && args[1].parse::<std::net::SocketAddr>().is_ok() {

let socket_address = if args.get(1).is_some()
&& args[1].parse::<std::net::SocketAddr>().is_ok()
{
args[1].parse().unwrap()
} else {
const DEFAULT_ADDRESS: &str = "127.0.0.1:50051";
DEFAULT_ADDRESS.parse().unwrap()
};

@sarukiti sarukiti marked this pull request as ready for review January 14, 2025 16:10
@sarukiti
Copy link
Contributor Author

後々のこと考えたらunwrap外に出さない方がいいということに気付きましてね

@sarukiti
Copy link
Contributor Author

フォーマットかけると55-56行目の改行が消えるんですけど,これも後々のことを考えるとあった方がいいというやつです

@sarukiti sarukiti merged commit 7c68235 into develop Jan 14, 2025
@sarukiti sarukiti deleted the feature/commandline-socket-address branch January 14, 2025 17:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants