0

私の C++/Qt5 プログラムを gdb の下で実行すると、不可能に思えることが経験されました。

while(totalAvailable > (sizeof(quint32)+sizeof(quint16))){  
    if(nullptr!=c){
        // POINT-A
        qDebug()<<rct<<"Courier message with ID "<<octomy_message_type_int<<" was received with name "<<c->getName()<<" and "<<bytesAvailable<<" bytes available";
        const quint16 bytesSpent=c->dataReceived(*ds, bytesAvailable);
        const int left=bytesAvailable-bytesSpent;
        totalAvailable-=bytesSpent;
        if(left>=0){
            if(left>0){
                ds->skipRawData(left);
                totalAvailable-=left;
            }
            else{
                // POINT-B
                qDebug()<<rct<<"LOLBOB";
            }
        }
        else{
            qWarning()<<"BAR";
            return;
        }
    }
    else{
        qWarning()<<"FOO";
        return;
    }
}

要するに、すべてが期待どおり//POINT-Aにステップインすると、デバッガーはプログラムの最初の行 (ステートメント) にジャンプします。しかし、コードにはorまたはその他の流れを変更するステートメントはありません。これはどのように可能ですか?//POINT-B//POINT-Bwhilebreakcontinue

コードをゼロから再構築して、偽のリンケージまたは同様の問題を排除しようとしましたが、バグはまだ再現可能です。

任意の入力を歓迎します。

4

4 に答える 4

2

POINT-B では、if の中にある else の中にいます。これが完了すると、ツリー全体で何もする必要がなくなります。

ポインターがどこにジャンプすると思いますか??

技術的には、POINT-B の 2 行後ろの閉じ括弧に移動し、次に POINT-B の 3 行後ろの閉じ括弧に移動し、次に POINT-B の 8 行後ろの閉じ括弧に移動し、最後に最後の閉じ括弧に移動します。 . これらはすべて何もしないため、スキップされます。

于 2016-07-02T01:47:54.030 に答える
1

紙と鉛筆を用意して、このコードのかたまりの論理フローを図解してください。

「POINT B」とマークしたステートメントの後に実行される可能性のある唯一のステートメントは、while ループの最初の条件であるという驚くべき発見をするでしょう。「POINT B」ステートメントを実行した後、ループの本体で実行するステートメントはこれ以上ないため、実行whileは次の反復のために条件に巻き戻されます。

于 2016-07-02T01:48:34.850 に答える