7

動的ライブラリをリンクするときに、次の警告に関する情報を見つけることができません。

In function `MyClass::myfunc()':
MyClass.cpp:(.text+0x14e4): warning: memset used with constant zero length parameter; this could be due to transposed parameters

以下は抜粋ですmyfunc

void MyClass::myfunc() {
    vector<Variable*>::const_iterator it;

    for (it = m_vars.begin();
         it != m_vars.end();
         ++it) {
        if ((*it)->recordme) {
            MyRecord* r = new MyRecord(*it);
            initMyRecord(*r);
            m_records.push_back(r);
        }
    }
}

したがって、このmemsetの考えられる原因を探す必要があるかどうかについては、かなり固執しています。新しいオペレーターへの電話は私の最初の容疑者ですが、これを探す価値があるかどうかさえわかりません. この警告を真剣に受け止めるべきか、それとも無視するべきか、どちらかわかりません。

質問: この警告についてどうすればよいですか? 後で自分の足を撃たないようにするには、どのようなパターンに気を付ければよいでしょうか?

更新: これはヘッダー ファイルにある MyRecord コンストラクターです。正しく理解すれば、インライン化される場合とされない場合があります。

class MyRecord {
public:
    MyRecord(const Variable* var) :
        buffer(0),
        lastSave(-1 * std::numeric_limits<double>::max()),
        sample(100),
        bufsize(100),
        gv(var),
        rec_function(0)
    {};
    virtual ~Record() {
        if (rec_function)
            delete rec_function;
        rec_function = 0;
    };

private:
    Record(const Record&);
    Record& operator=(const Record& rec);

public: // @todo: remove publicness
    boost::circular_buffer< boost::tuple<double,boost::any> > buffer;
    double lastSave;
    double sample;
    unsigned int bufsize;
    const Variable* gv;
    RecordFunctor* rec_function;
};

RecordFunctor は純粋仮想構造体です。

struct RecordFunctor {
    virtual ~RecordFunctor() {};
    virtual void record(const double) = 0;
};

追加情報?フラグ-O2と g++ でコンパイルしています (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1

4

2 に答える 2

17

ポインタ引数が有効である限りmemset()、サイズがの関数の動作は明確に定義されています。0

C99標準のセクション7.21.1、またはC11標準の7.24.1を参照してください。

size_t nとして宣言された引数が関数の配列の長さを指定する場合、nはその関数の呼び出しで値ゼロを持つことができます。

一方、警告は賢明なものです。のような呼び出しmemset(s, 0, 0)は危険ではありませんが、有用ではなく(何もしません)、プログラミングエラーを簡単に示す可能性があります。

グレッグの答えは、この場合にそれを回避する方法を説明しています。

于 2012-07-09T20:18:10.880 に答える
8

0の aでboost::circular_bufferコンストラクターを呼び出しています。これにより、コンストラクターが循環バッファーによって使用されるストレージを初期化するために呼び出される可能性がありますが、サイズ 0 のバッファーが必要であると伝えています。capacitymemset()

解決策は、ゼロではなく、必要な実際のサイズをコンストラクターに与えるcircular_bufferことです (ゼロは意味がありません)。

于 2012-07-09T20:11:38.667 に答える