2016-03-17 4 views
11

私の物理的なレンダラでは、メモリ破損のバグが発生しています(プログラムがクラッシュし、デバッガが役に立たないスタックトレースを与える)。私はこれをこのSSCCEまで追跡しました。新しい[]コンストラクタを含むバイトオブジェクトの配列には何も問題はありません。

#include <cstdint> 

class Foo final { 
    public: 
     uint8_t packed; 

    public: 
     inline Foo(void) : packed(0xFF) {} //causes error 
     inline ~Foo(void) = default; 
}; 
static_assert(sizeof(Foo)==sizeof(uint8_t),"Implementation error!"); 

int main(int /*argc*/, char* /*argv*/[]) { 
    Foo* arr = new Foo[4]; //Tried a bunch of different sizes. All fail. 
    delete [] arr; 

    return 0; 
} 

問題がMSVCまたはGCC、唯一のインテルコンパイラー(16.0するバージョン)のため発生しません:コンストラクタを持つ行がエラーをトリガするもののようです。しかし、これはメモリー破損バグであるため、実際には何も意味しません。私がバグレポートを提出する前に、誰かがこれがC++を悪用しているのではないことを確認できますか?


Hereは、この問題を実証するための完全な解決策です。 Hereがアセンブリです。

+1

あなたはメモリ破損の詳細を提供できますか?それはすべての値ですか、破損のパターンがありますか、アプリケーションがクラッシュするのか、奇妙なデータなどを提供するのでしょうか?私はメモリ破損の原因となるものは見当たりませんが、私はC++のビットフィールド宣言の専門家でもありません。あなたのstatic_assertが真である限り、あなたのクラスはビットを正しくパッキングする必要があります。また、ビットパックされた構造体をパックされていないintに変換し、エラーがないことを確認できますか? –

+0

32767個以下の要素を割り当てる場合は、壊れてしまいますか?私は 'delete'の間にメモリ破損エラーが発生したと思いますか? –

+0

@MattJordan私は例を大幅に簡略化しました。残念ながら、メモリ破損は単なるクラッシュです。デバッガが役に立たないと言うので、デバッグするのは非常に難しいです。 – imallett

答えて

5

コメントの中で確立されているように、一連のますます単純な例(およびそれに対応する編集)では、これは完全に有効なC++コードです。

私はa bug reportをIntelの開発者フォーラムに投稿しました。正式にそのように確認されています。

関連する問題