未定义的行为:代码审查的清单

时间:2011-06-07 03:58:14

标签: c++ undefined-behavior

  

可能重复:
  What are all the common undefined behaviour that a C++ programmer should know about?

我准备为C ++ self& amp准备一份清单或指南。同行代码评论,因为有很多场景可能导致可怕的Undefined Behavior领域,我想在大多数使用最多的C ++语言结构中提出一种未定义行为的清单。

当然,不可能通过Sequence points之间的变量修改来预测未定义的行为,但我认为可以列出从其他场景中发现的场景。

如果您正在执行代码审核,您会注意哪些Undefined Behavior生产方案?

4 个答案:

答案 0 :(得分:2)

(1)错误delete

T* p = new T[N];
delete p; // ...1
delete (p+x); //...2

(2)缺少return

int* foo ()
{
  // code
  return p;
  // code
}

(3)加倍delete

(4)对临时

的引用

(5)向自身添加vector元素(定义尺寸时)

  vector<int> vi(1);
  vi.push_back(0);
  vi.push_back(vi[0]); // it can become a use case of pt(4) (sometimes)

答案 1 :(得分:1)

仅删除新添加的指针。例如,您无法调用p = new int [5];然后调用delete p+2;这可能会导致未定义的行为。

同样在尝试使用dll时,只使用原始类型,因为不同的编译器会创建不同的内存布局,如果您尝试交换类或结构,可能会导致一些问题。

我能想到的另一件事是要注意已删除的内存,在某些情况下,您可以在没有任何错误或访问冲突的情况下从这些地方进行写入和读取,但它始终是未定义的行为。

答案 2 :(得分:1)

多态基类中虚拟析构函数的不可用性

琐碎的例子

class Base
{
   public:
    Base();
   // some virtual functions     
   // no virtual destructor
   ~Base();
};

class Derived : public Base
{
   public:
   Derived();
   // override the functions here      
   ~Derived();
};
// definitions
int main()
{
   Base *p = new Derived();
   // function calls
   delete p; // UB
}

Here是C ++中未定义行为场景的综合列表。

答案 3 :(得分:1)

与其他答案相比,案例不太明显:

  • 未定义不同翻译单元中非局部静态的初始化顺序。那就是:

a.cpp

struct SomeStatic
{
    SomeStatic()
    {
        // Some init code
    }
    void AMethodUsingTheInitdCode()
    {
        //Blah blah
    }
} static;

b.cpp

struct SomeStatic;
extern SomeStatic static;

struct SomeOtherStatic
{
    SomeOtherStatic()
    {
        static.AMethodUsingTheInitdCode(); //Undefined -- SomeStatic's init code may not have run yet.
    }
} runMe;