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 调用boost::circular_buffer构造函数capacity。这可能会导致该构造函数调用memset()以初始化循环缓冲区使用的存储,但您已经告诉它您想要一个大小为零的缓冲区。

解决方案是给circular_buffer构造函数你想要的实际大小,而不是零(零没有意义)。

于 2012-07-09T20:11:38.667 回答