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

接口的参数类型和返回类型不应为 void*

6.4.4 ID_forbidFunctionVoidPtr
目录 › next › previous

与接口相关的数据类型应保持精确,不应将参数类型或返回类型设为 void*。

在 C++ 代码中,如果参数或返回值需要面对多种不同类型的数据,应合理使用重载或模板机制。

示例:

class A {
public:
    void* foo();      // Non-compliant
    void bar(void*);  // Non-compliant
};

例中 foo 和 bar 函数的返回值以及参数是不符合要求的。

C 语言中存在大量的库函数不符合本规则要求,在 C++ 代码中应避免使用,如:

int buf[123];
memset(buf, 0, 123);  // Logic error, should be ‘123 * sizeof(int)’

例中 memset 函数的第一个形式参数就是 void* 型,只能通过更底层的二进制方式访问对象序列,是一种对类型设计的破坏,应改用 STL 标准库提供的方法:

int buf[123];
std::fill_n(buf, 123, 0);  // Safe and brief

改用类型明确的方法可以使很多问题在编译期得到控制。

例外:

struct T {
    void* operator new(size_t);   // Compliant
    void operator delete(void*);  // Compliant
};

C++ 语言规定 new 运算符的返回类型为 void*,delete 运算符的参数类型为 void*,这些情况可不受本规则约束。

相关

ID_voidCast ID_forbidMemberVoidPtr

参考

C++ Core Guidelines I.4
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.