構造体として実装している構成フラグがいくつかあります。オブジェクトを作成します。フラグを使用してオブジェクトのメソッドを呼び出します。これにより、最終的に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」の両方で正常であることを確認できます。ただし、method3に到達すると、「FLAG1.flag」が破損しているため、比較に失敗します。
さて、私は通常それを行わないことに優れており、最も厳しい設定でMSVCの静的コード分析に合格しますが、これはバッファオーバーランの動作のように見えます。
調べてもそのようなエラーは見つかりませんでしたが、もちろん通常は見つかりません。私の質問は
Aです:私はどこか別の場所を台無しにしていますか?実際のコードを共有していないことに気づきましたが、すでに何かが足りませんか?このスキームは、コードの大部分を書き直す前に機能していました。
B:コードが見つかるまで、コードを注意深く選択するよりも簡単な方法はありますか?コードはクロスプラットフォームなので、UbuntuボックスでValgrindをチェックするようにすでに設定しています。