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