-2

構造体として実装している構成フラグがいくつかあります。オブジェクトを作成します。フラグを使用してオブジェクトのメソッドを呼び出します。これにより、最終的に2つのフラグ間の比較がトリガーされます。ただし、この時点で、フラグの1つが何らかの形で上書きされています。

明確にするために、これは私が見ているものを説明する必要があるコードの非常に単純化されたバージョンです:

class flag_type { unsigned int flag; /*more stuff*/ };
flag_type FLAG1
flag_type FLAG2

class MyObject {
    public:
        void method1(const flag_type& flag_arg) {
            //conditionals, and then:
            const flag_type flag_args[2] = {flag_arg,flag_arg};
            method2(flag_args);
        }
        void method2(const flag_type flag_args[2]) {
            //conditionals, and then:
            method3(flag_args[0]);
        }
        void method3(const flag_type& flag_arg) { //Actually in a superclass
            //stuff
            if (flag_arg==FLAG1) { /*stuff*/ }
            //stuff
        }
};

int main(int argc, const char* argv[]) {
    //In some functions called by main:
    MyObject* obj = new MyObject();

    //Later in some other functions:
    obj->method1(FLAG1);
}

デバッガーとprintステートメントを使用すると、FLAG1とflag_arg/flag_argsの両方が「method1」と「method2」の両方で正常であることを確認できます。ただし、me​​thod3に到達すると、「FLAG1.flag」が破損しているため、比較に失敗します。

さて、私は通常それを行わないことに優れており、最も厳しい設定でMSVCの静的コード分析に合格しますが、これはバッファオーバーランの動作のように見えます。

調べてもそのようなエラーは見つかりませんでしたが、もちろん通常は見つかりません。私の質問は
Aです:私はどこか別の場所を台無しにしていますか?実際のコードを共有していないことに気づきましたが、すでに何かが足りませんか?このスキームは、コードの大部分を書き直す前に機能していました。
B:コードが見つかるまで、コードを注意深く選択するよりも簡単な方法はありますか?コードはクロスプラットフォームなので、UbuntuボックスでValgrindをチェックするようにすでに設定しています。

4

1 に答える 1

0

助けようとした人に感謝します。ただし、コードは明確化のみを目的としていることに注意してください。私はそれを最初から入力して、一般的に起こっていることを示しました。コンパイルしないでください。振り返ってみると、あまりにも少ない情報に基づいて人々に解決を求めるのは公平ではなかったと思いますが、私の実際の質問「コードをより慎重に選択するよりも簡単な方法はありますか」は、実際に問題を解決することにはあまり関係していませんでした- ――どうアプローチするか。

この質問に関しては、Ubuntu Linux で「スタック スマッシング」が表示され、多かれ少なかれ問題が発生した場所がわかりました。興味深いことに、スタック破壊のトレースバックが最も役に立ちました。簡単に言えば、それは恥ずかしいほど基本的なエラーでした。strcpy がオーバーフローしていました (~、|、および & の演算子では、フラグにこのように設定されたデバッグ文字列があります)。少なくとも、そのコードを書いたのは私ではありません。常にstrncpyを使用してください、人々:P

于 2012-06-30T21:56:18.557 に答える