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

时间:2012-07-09 19:47:16

标签: 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

以下是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

2 个答案:

答案 0 :(得分:15)

只要指针参数有效,就可以很好地定义大小为memset()的{​​{1}}函数的行为。

参见C99标准的7.21.1部分或C11标准的7.24.1:

  

声明为 size_t n 的参数指定的长度   对于函数的数组,n在调用它时可以为零   功能

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

Greg的回答解释了在这种情况下如何避免它。

答案 1 :(得分:6)

您正在使用capacity调用boost::circular_buffer constructor。这可能会导致构造函数调用memset()来初始化循环缓冲区使用的存储空间,但是您已经告诉它了你想要一个零大小的缓冲区。

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