パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

高性能化のための改善が続けられているyesコマンド」記事へのコメント

  • GNUのyesコマンドと対照的なのがOpenBSDのyesコマンドのソース [openbsd.org]。

    ご覧のとおり見たまんまで、まったく捻りなし。

    特徴的なのが、実行開始時にpledgeというシステムコールを発効しているところ。
    これを行うことで、それ以降のシステムコールの実行を標準入出力関連のものだけに制限している。
    もしyesに脆弱性があっても、それを利用した悪さができにくいようになっている。

    改善というのは高性能化だけではない、ってことですな。

    • by Anonymous Coward on 2017年11月11日 19時24分 (#3310788)

      plegdeは良いと思うけれど、同じ意味のfor(;;) puts()が繰り返されるのが嫌だな。
      私はV7の三項演算子使ったやつの方が好き。

      親コメント
      • by Helion (8785) on 2017年11月11日 19時43分 (#3310797) 日記
        これ [tuhs.org]だとループごとにargc>1の判定が入るように見えてちょっと気になります (もちろん実際には最適化されるでしょうけど)
        親コメント
        • by Anonymous Coward

          最適化されない気がする。引数が処理中に書き換わる可能性がゼロじゃないと。

          • by Anonymous Coward

            argc>1の評価はmain()の呼出毎に不変だから現代のコンパイラなら最適化されるよ。

            main(argc, argv)
            char **argv;
            {
                    char *p = argc>1? argv[1]: "y";

                    for (;;)
                            printf("%s\n", p);
            }

            みたいな感じに解釈されると思う。

            • by Anonymous Coward

              OpenBSDを-O付きでコンパイルする奴は素人

            • by Anonymous Coward

              ど素人の質問で恐縮だけど、現代のコンパイラはそのサンプルコードのprintf()が行っている文字列代入も最初の一回しか行わないよう最適化してくれるの?

              • by Anonymous Coward on 2017年11月13日 14時09分 (#3311275)

                上のコードをgcc -O3でコンパイルするとこんな風に最適化される

                main(argc, argv)
                char **argv;
                {
                                if (argc>1) {
                                        for (;;)
                                                puts(argv[1]);
                                } else {
                                        for (;;) {
                                                puts("y");
                                                puts("y");
                                        }
                                }
                }

                printf自体が無駄だと判断してputsに置き換えてるみたい

                親コメント
              • by Anonymous Coward

                「printf()が行っている文字列代入」って何のことだろう。
                sprintf系ならそう表現するのも分からなくはないが、
                fprintfやprintfは書式指定を解釈して出力先のストリームに書き込む動作だから、
                引数を除けば出力先のストリームが持つバッファリング処理でしかどこかに格納される事はないよ。

                printfによる書式の処理が一回だけになるのか、って意味なら、
                ライブラリが静的リンクでリンク時最適化が掛かればワンチャンあるかも程度でほぼ期待できないかと。

                printfをインラインにしてくれるstdio.hとかあるんだろうか。あればもうちょい期待出来るが・・・あるのか?

              • by Anonymous Coward

                おお、printfの中身までちゃんとバラすんだ。
                どういう方法でライブラリ関数を展開しているんだろう。

アレゲはアレゲ以上のなにものでもなさげ -- アレゲ研究家

処理中...