3

再現できない1回のアサーションエラーが発生したC++アプリケーションがあります。一度失敗したコードは次のとおりです。

unsigned int test(std::vector<CAction> actionQueue) {
  unsigned int theLastCount = actionQueue.size() - 1;

  std::vector<CAction>::const_reverse_iterator rItr = actionQueue.rbegin();
  std::vector<CAction>::const_reverse_iterator rEndItr = actionQueue.rend();

  for (; rItr != rEndItr; ++rItr, --theLastCount) {
    const CAction &fileAction = *rItr;

    if (fileAction.test()) {
      continue;
    }
    return theLastCount;
  }

  assert(theLastCount == 0); // How could this fail?

  return theLastCount;
}

どういうわけか、ループが完了した後、LastCountはゼロではありませんでした。

私がロジックを読んだところ、次の場合を除いて、これは不可能なはずです。

  1. 他のスレッドの側面がactionQueueに影響を及ぼしました(これは可能ではないと思います)。
  2. 一時的なメモリの破損が発生しました。

ここで愚かなことを見逃していますか?表示されているコードにバグがありますか?これを見た場合、ベクトルには2つの要素があるため、LastCountは1に初期化されているはずです。

4

5 に答える 5

5

test()がすべてのfileActionsに合格した場合、theLastCountは-1になると思います。検討:

theLastCountはactionQueue.size()-1から始まります。actionQueue内のアイテムごとに1回デクリメントします。つまり、actionQueue.size()-1 --actionQueue.size()=-1になります。考えてみてください。theLastCountは、現在のイテレータのインデックスを保持します。しかし、現在のイテレータがrendの場合、それは配列の開始前の1つのイテレータであり、-1です。

編集:ああ、それは署名されていません。ただし、ゼロと等しいかどうかをテストするだけなので、ここでは積分オーバーフローはそれほど重要ではありません。

于 2011-01-15T19:57:46.707 に答える
2

actionQueueが空の場合、

unsigned int theLastCount = actionQueue.size() - 1;

theLastCount可能な最大の符号なし整数に設定されます。逆イテレータは(空のコンテナでは)互いに等しいため、内部ループは実行されません。したがって、驚くほど膨大な数rbegin() == rend()でアサーションにヒットします。theLastCount

于 2011-01-15T19:57:20.343 に答える
1

ここに投稿する前に、コードをコンパイルして実行してください。まず、このコードはコンパイルされません(理由はわかりませんが、コンパイラーに問い合わせることができます)。次に、LastCountは常に(unsigned int)-1であるため、アサーションが成功することはありません。

于 2011-01-15T20:05:53.993 に答える
1
void test(std::vector<CAction> actionQueue) 
{
  unsigned int theLastCount = actionQueue.size() - 1;
  /** Omitted code ***/
  {
    /** Omitted code ***/
    return theLastCount;
  }
  return theLastCount;
}

再現できないエラーを忘れてください。しかし、ここに1つの重大な問題があります。返品タイプはですがvoid、返品しますunsigned int!! どうして?


私はあなたがこれを書く必要があると思います:

assert(theLastCount == -1);//correct assert!

これは、test()すべての要素のパスの場合、LastCountが-1になる必要があるためです。要素が残っていないため、要素がある場合、LastCountは常に有効な要素インデックスです。それ以外の場合は-1になります。

注:のタイプをtheLastCountからunsigned intに変更しintます。

于 2011-01-15T20:01:10.423 に答える
0

キューが空の場合はどうなりますか?

theLastCount-1になり、その後... :-)

于 2011-01-15T19:58:13.173 に答える