在链接动态库时,我无法找到有关以下警告的任何信息:
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
答案 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
构造函数提供所需的实际大小,而不是零(零没有意义)。