与零长度参数一起使用的memset:忽略或注意?

Yup*_*ing 5 c++ warnings

链接动态库时,我无法找到有关以下警告的任何信息:

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

以下是摘录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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以如果我正在寻找这个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;
};
Run Code Online (Sandbox Code Playgroud)

RecordFunctor是一个纯虚拟结构:

struct RecordFunctor {
    virtual ~RecordFunctor() {};
    virtual void record(const double) = 0;
};
Run Code Online (Sandbox Code Playgroud)

附加信息?我正在使用flags -O2和g ++编译(Ubuntu/Linaro 4.6.1-9ubuntu3)4.6.1

Kei*_*son 15

只要指针参数有效,就可以很好地定义memset()大小为的函数的行为0.

参见C99标准的7.21.1节或C11标准的7.24.1节:

如果声明为size_t n的参数指定了函数数组的长度,则在调用该函数时,n的值可以为零.

另一方面,警告是明智的; 类似的调用memset(s, 0, 0)并不危险,但它没用(它什么都不做),并且很容易指出编程错误.

格雷格的答案解释了在这种情况下如何避免它.


Gre*_*ill 6

您正在使用0 调用boost::circular_buffer构造函数capacity.这可能导致构造函数调用memset()以初始化循环缓冲区使用的存储,但您已经告诉它您需要一个零大小的缓冲区.

解决方案是为circular_buffer构造函数提供所需的实际大小,而不是零(零没有意义).