typ3c的类型推断算法

typ3c通过分析函数对参数的使用方式来决定将其标记为𝑐ℎ𝑘(受检类型)或𝑤𝑖𝑙𝑑:

安全使用参数:当函数安全使用参数时(如示例中baz函数的参数c),typ3c会赋予其受检类型ptr。若调用者传入未检指针(如bar函数第26行传递的g),3C会在调用点插入assume_bounds_cast(见2.4节),提示程序员需要在此处进行修改。

不安全使用参数:当函数存在不安全操作时(如首个示例中func函数对z的使用),typ3c会将该参数标记为𝑤𝑖𝑙𝑑。为避免污染调用者参数,3C会插入中间类型(itype),使得外部仍可传递受检类型参数(如清单1(b)第25行调用foo(r,z)时,r保持𝑐ℎ𝑘状态)。

局部野性实现机制

分析清单1(a)时生成的类型流图,其实现关键点在于:

双重节点设计:每个函数参数对应两个节点——外部节点(调用点使用)和内部节点(函数内部使用),两者通过单向边(外部→内部)连接。

逆向调用边:函数调用会创建从被调函数外部参数节点到实参节点的有向边(如foo函数第18行调用baz时,建立外部q→内部p的边)。这种逆向数据流设计阻断了实参与形参之间的双向影响,确保调用双方相互独立。例如:

即使g是𝑤𝑖𝑙𝑑且通过baz(r,g,z)传递给参数c,逆向边阻止了"野火蔓延"

foo函数的参数p虽最终为𝑤𝑖𝑙𝑑,但第25行foo(r,z)调用不会污染r

特殊处理场景

对于系统头文件中的外部函数(如recordptr)或宏定义,由于3C无法查看/修改其实现,会强制建立𝑊 → 𝑥𝑒边(𝑥𝑒为参数外部节点),导致传入实参被标记为𝑤𝑖𝑙𝑑(如第16行的p)。类型推断完成后:

当内外节点均为𝑐ℎ𝑘时:参数获得受检类型

外部𝑐ℎ𝑘而内部𝑤𝑖𝑙𝑑时:参数获得itype

内外均为𝑤𝑖𝑙𝑑时:保持原类型

值得注意的是,逆向调用边允许形参推断为𝑐ℎ𝑘而实参为𝑤𝑖𝑙𝑑,此时3C会在调用点插入类型转换(如清单1(b)中对baz的调用处理)。

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