函数内部野性(wildness)的局部化处理

3C工具的设计目标是尽可能自动化注释流程,同时将开发人员需手动完成的工作隔离并最小化。为此,它采用了一种创新的函数及函数调用处理机制。考虑以下代码示例:

int deref(int *y) { return *y; }

int bar(void) { int *p = (int *)5; deref(p); }

若遵循基础方法,关系图将包含节点𝑊、𝑦和𝑝,以及两条边:𝑊 → 𝑝(源于赋值语句p = (int *)5)和𝑝 ↔ 𝑦(源于调用deref(p))。这将导致y和p最终都被标记为𝑤𝑖𝑙𝑑(野指针)。本质上,向deref传递𝑤𝑖𝑙𝑑指针p会强制其参数y也变为𝑤𝑖𝑙𝑑。虽然这种处理看似合理(传递不安全指针可能导致函数异常),但deref函数本身是完全安全的——若不存在bar函数,将deref参数类型设为ptr可通过类型检查。因此,将y标记为𝑤𝑖𝑙𝑑只会增加移植时程序员的工作量。

识别不可转换的野指针