使用memset的零长度参数:忽视或看出来吗?(memset used with zero leng

2019-09-19 06:05发布

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

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

Answer 1:

您呼叫的boost::circular_buffer构造与capacity的0。这可能会导致该构造函数调用memset()来初始化通过循环缓冲区使用的存储,但是你告诉它你想零大小的缓冲区。

解决的办法是给circular_buffer构造所需的实际大小,而不是0(零没有意义)。



Answer 2:

的行为memset()的大小的函数0被很好地定义,只要指针参数是有效的。

见C99标准,或C11标准的7.24.1第7.21.1:

其中一个参数声明为为size_t n指定的数组的函数的长度,n可以到该函数的调用具有零值。

在另一方面,该警告是明智的; 像调用memset(s, 0, 0)并不危险,但它不是有用的(什么都不做),并可以很容易地表明一个编程错误。

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



文章来源: memset used with zero length parameter: ignore or watch out?
标签: c++ warnings