-1

ある面接で次の質問をされたことがあるのですが、いまだにはっきりとは答えられません。私がどこでもっと学べるか知っている人がいるかどうか疑問に思っていました.グーグルはあまり役に立ちませんでした:

テストしたいプログラムがあるとします。1 つのログ ステートメントを追加すると、突然、期待される出力を生成していたプログラムが期待される出力の生成を停止します。何が起こったのでしょうか?

4

2 に答える 2

3

あはは。私は実際にこれが起こったことがあります。

スタックをいじるバグがあるプログラムを考えてみましょう。ログまたは印刷ステートメントを導入すると、ログへの呼び出しによってスタックが十分にシフトされ、動作が変更される可能性があります。

例をどのように示すかを考えるのは興味深い問題です。おそらく最も簡単なのは、printf の不適切なフォーマットで実行することです...

わかりました、少なくとも例は次のようになります。

int parent(){ ... printf("%s\n", itoa(child()));

int child(){
    int num;
    scanf("%d%d", num);  /* notice the format; scanf is going to eat more of the
                           * stack than it should.
                           */
    return num;            /* but this return may unwind the stack successfully. */
}

printf()リターンの直前にa を挿入すると、ケースが発生します。

于 2009-07-24T07:21:36.447 に答える
2

プログラムには同時スレッド間で競合状態が発生する可能性があるため、タイミングを変更するとプログラムの動作が変わる可能性があります。

通常、これは逆であり、さらに悪いことです (いわゆるHeisenbug ): プログラムが正しく動作せず、ログ出力を追加してデバッグしたい場合。しかし、ログ出力によって問題が解消されるため、診断が非常に難しくなります。

于 2009-07-24T08:31:15.463 に答える