我正在使用编译器在 AIX上构建CppcheckxlC
(请参阅上一个问题)。Checker 类都派生自一个Check
类,该类的构造函数将每个对象注册到一个全局列表中:
检查.h
class Check {
public:
Check() {
instances().push_back(this);
instances().sort();
}
static std::list<Check *> &instances();
virtual std::string name() const = 0;
private:
bool operator<(const Check *other) const {
return (name() < other->name());
}
};
检查缓冲区溢出.h
class CheckBufferOverrun: public Check {
public:
// ...
std::string name() const {
return "Bounds checking";
}
};
我似乎遇到的问题与instances().sort()
通话有关。sort()
将对静态列表中的每个指针调用Check::operator<()
which 调用,但刚刚添加到列表中的实例尚未完全运行其构造函数(因为它仍在 inside )。因此,在构造函数完成之前调用这样的指针应该是未定义的行为。Check::name()
instances()
Check
Check::Check()
->name()
CheckBufferOverrun
这真的是未定义的行为,还是我在这里错过了一个微妙之处?
请注意,我不认为调用 tosort()
是严格要求的,但效果是 Cppcheck 以确定的顺序运行其所有检查器。这只会影响检测到错误的顺序的输出,这会导致某些测试用例失败,因为它们期望以特定顺序输出。
更新:上述问题仍然(大部分)存在。但是,我认为sort()
构造函数中的调用没有引起问题(即通过调用纯虚函数而崩溃)的真正原因Check::operator<(const Check *)
是sort()
! 相反,sort()
似乎改为比较指针。这发生在g++
和xlC
中,表明 Cppcheck 代码本身存在问题。