☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

const、volatile 限定指针类型的别名是可疑的

6.2.2 ID_qualifierForPtrAlias
目录 › next › previous

如果用 const、volatile 限定指针类型的别名,很可能会造成意料之外的错误。

示例:

struct Type {
    void foo();
    void foo() const;
};

typedef Type* Alias;

void bar(const Alias a) {  // Rather suspicious
    a->foo();              // Calls ‘void Type::foo();’
}

例中 Alias 是 Type* 的别名,“const Alias a”很容易引起误解,好像对象是不可被改变的,但实际上 a 的类型是 Type *const,const 限定的是指针而不是指针指向的对象,对象仍可被修改,其调用的函数也可能与预期不符。

应避免为指针类型定义别名,否则应提供常量和非常量两种别名,如:

typedef Type* Alias;
typedef const Type* ConstAlias;

void bar(ConstAlias a) {
    a->foo();              // Calls ‘void Type::foo() const;’
}

注意,如果用 const、volatile 限定引用的别名则是错误的,详见 ID_qualifierInvalid。

相关

ID_qualifierInvalid

参考

SEI CERT DCL05-C
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.