UNREACH.SIZEOF

因“sizeof”上的条件造成的不可访问的代码

UNREACH.SIZEOF 检查器会查找永远不会执行的代码,因为该代码由数据类型大小(通过 sizeof 关键字计算得出)上的条件保护,当编译代码时,该条件在目标体系结构上始终为 false。通常,UNREACH.SIZEOF 用于将因体系结构相关的 sizeof 上的条件导致的无法访问代码与其他类型的无法访问代码分离。如果预期存在依赖于所使用的数据类型大小的不可访问代码,但是您仍然想要使用 UNREACH.GEN 检查更普遍的无法访问代码,则关闭 UNREACH.SIZEOF 检查器将有帮助。

漏洞与风险

因 sizeof 上的条件导致的不可访问代码会在代码维护和/或代码评审时引起混淆。

漏洞代码示例

复制
 int get_ptr_size(void* ptr)
 {
   int x = 0;
   switch (sizeof(ptr)) {
   case 4
     x = 4;
     break;
   case 8
     x = 8;
    break;
  default
    x = 16;
    break;
  }
  return x;
 }

Klocwork 会生成无法访问的代码报告,指明某些情况从未实现过。报告的情况取决于目标体系结构。例如,如果目标体系结构中的指针大小为 32 位(4 个字节),则情况 4 仅为可实现的情况。之后,将针对情况 8(第 9 行)报告缺陷。显然,在此场景中,该行为是良性的,一般会导致审阅者关闭该检查器(特别是当打算针对不同体系结构编译代码时)。

相关检查器

扩展

此检查器无法进行扩展。