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

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

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

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

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

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

    • by Anonymous Coward

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

      • これ [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

              ど素人の質問で恐縮だけど、現代のコンパイラはそのサンプルコードの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の中身までちゃんとバラすんだ。
                どういう方法でライブラリ関数を展開しているんだろう。

にわかな奴ほど語りたがる -- あるハッカー

処理中...