诊断为何编码规范违规未按预期显示
问题
您预计某行代码存在编码违规,但 Polyspace® Bug Finder™ 分析未显示违规。
使用 Polyspace Bug Finder 进行默认代码分析可能无法检测到某些潜在缺陷。如果预期缺陷未出现,您可能需要启用其他检查项,并指定适合您分析的检查项选项。例如:
void foo(int* p, int i) { *p = i; }
foo
解引用了一个来源点未知的指针。您可能会期望 Bug Finder 将指针标记为被污染。默认的 Bug Finder 分析不会查找被污染的指针。要将源自当前分析范围之外的指针标记为被污染,请启用检查项 TAINTED_PTR
。然后,使用选项 -consider-analysis-perimeter-as-trust-boundary
限制信任边界。可能的解决方案
检查规则检查项是否已启用
您可能已启用了一组缩减版的编码规则,这些规则排除了预期规则。
例如,如果您检查 MISRA C™:2012 规则,分析默认仅启用 mandatory-required
子集。要检查其他 MISRA C:2012 规则,需指定相应的选项。
检查您使用的编码规则选项。请参阅编码标准和代码度量。
检查源文件是否被排除在分析之外
默认情况下,位于与源文件不同位置的头文件中的编码规则违规会被抑制(不报告)。某些源文件可能被有意排除在编码规则分析之外。请参阅不为以下项生成结果 (-do-not-generate-results-for)
。如果您正在分析此类文件,则文件中的所有编码违规可能会被抑制。
检查规则违规是否出现在宏中
当宏定义中出现违规时,Polyspace 仅在宏定义中显示一次结果。只有当违规由宏实例的参数显式引发时,才会报告宏实例的违规。如果宏定义出现在头文件中,则违规可以会被抑制,不显示在结果中。另请参阅Polyspace Results in Lines Containing Macros。如果您预计宏会出现编码违规:
检查宏定义以查找违规项。
如果宏定义位于头文件中,请检查是否抑制了头文件中的编码违规。请参阅
不为以下项生成结果 (-do-not-generate-results-for)
。
在源窗格中,要查看一行是否包含宏扩展,请查找 图标。
检查编译错误
如果分析中的任何源文件无法编译,则代码规范检查将不完整。编码规则检查项的结果:
可能不包含未编译文件的完整结果。
可能不包含已编译文件的完整结果,因为某些规则仅在编译完成后才会进行检查。
检查编译错误。请参阅View Error Information When Polyspace Analysis Stops。
检查规则检查项是否需要扩展
您代码中的某些结构在特定情况下可能会违反编码规则。默认的 Bug Finder 分析可能不会报告这些潜在违规情况,以减少误报。通过扩展现有的 Bug Finder 编码规则检查项来检测这些问题。使用以下选项修改检查项的行为:
-consider-analysis-perimeter-as-trust-boundary
:默认情况下,Polyspace 仅将用户输入视为被污染数据。使用此选项后,任何源自当前分析边界之外的数据都将被视为污染数据。请参阅Sources of Tainting in a Polyspace Analysis。-detect-atomic-data-race
:默认情况下,Polyspace 假设某些操作是原子操作,并将其排除在数据竞争检查之外。这些操作在您的环境中可能并非原子操作。使用此选项将数据竞争检查项扩展到包括假定的原子操作。请参阅Extend Data Race Checkers to Atomic Operations。
有关扩展或修改 Bug Finder 检查项的选项列表,请参阅 Modify Default Behavior of Bug Finder Checkers。
检查分析是否需要有关代码的额外信息
Polyspace 可能需要有关您代码的更多信息来检测某些编码违规。例如:
与正确使用标准库数学函数相关的规则检查项 - 默认情况下,这些检查项会检查标准库数学函数的使用是否有效。如果您使用具有域或其他约束的自定义数学库,默认的 Polyspace 分析无法检测到这些约束的违反情况。如果自定义库函数与标准库数学函数具有相似的域和约束,则可以将这些检查项扩展到自定义库。请参阅Extend Bug Finder Checkers for Standard Library Functions to Custom Libraries。
与多任务问题相关的规则检查项 - 默认情况下,如果您使用某些库中的例程,Polyspace Bug Finder 会自动检测线程创建和保护机制,。请参阅Auto-Detection of Thread Creation and Critical Section in Polyspace。如果您使用的是 Polyspace 不支持的自定义并发库,为了检测潜在的缺陷,请执行以下操作之一:
(如果可能)将自定义库映射到受支持的库,请参阅Extend Concurrency Defect Checkers to Unsupported Multithreading Environments。
手动配置分析。请参阅手动配置 Polyspace 多任务分析。
与黑名单关键字和函数使用相关的规则检查项 - 除非您指定了哪些关键字和函数被列入黑名单,否则这些检查项无法标记被列入黑名单的关键字和函数。请参阅Flag Deprecated or Unsafe Functions, Keywords, or Macros Using Bug Finder Checkers。
与动态内存和实时函数的使用相关的规则检查项 - 除非您指定哪些函数是实时函数以及哪些函数分配会动态内存,否则这些检查项无法实时标记动态内存的使用或其他违规情况。请参阅Modify Bug Finder Checkers Through Code Behavior Specifications。
有关需要您提供代码附加信息的检查项的完整列表,请参阅 Modify Default Behavior of Bug Finder Checkers。
检查规则是否适用于源文件
某些编码规则仅适用于头文件。违反这些规则的情况不会在非头文件源文件中报告。例如,违反 MISRA C++:2008 Rule 3-1-1
或 AUTOSAR C++14 Rule A3-1-1
等规则的情况仅在头文件中报告。
检查规则违规是否在未调用的 static
函数中
如果检查结果发现编码违规需要跟踪函数之间的数据传播,则该违规称为过程间违规。Bug Finder 不检查以下类型的函数是否存在过程内规则违规:
static
函数,这些函数未直接或间接被main()
或另一个非static
函数调用。仅被上述
static
函数调用的函数。
要检测 static
函数中的过程间编码违规,请在代码中调用 static
函数。
检查违规是否出现在未使用的代码中
如果某些构造未被使用,Bug Finder 不会报告其中的编码违规。例如:
模板和宏:对于未实例化的模板和未使用的宏,某些编码违规不会被报告。
函数声明和 typedef:针对声明和 typedef 不匹配的编码规则违规,若函数声明和 typedef 未被使用,违规可能不会被报告。
要检查这些代码结构是否存在所有可能的编码违规,请在代码中至少调用它们一次。
检查是否指定了所需的多任务处理选项
对于与多任务相关的规则检查项,可能需要指定并发选项才能查看这些规则的违规情况。
Polyspace 会自动检测一些多任务库。请参阅Auto-Detection of Thread Creation and Critical Section in Polyspace。根据您的库,您可能需要手动配置多任务选项。请参阅手动配置 Polyspace 多任务分析。您还可以使用选项 -code-behavior-specifications
将库映射到受支持的库。请参阅Extend Concurrency Defect Checkers to Unsupported Multithreading Environments。
检查条件预处理器模块中是否存在 MISRA C 编码违规
如果条件为假,则条件预处理器模块(如 #if
或 #ifdef
)中的代码将从预处理代码中排除。MISRA C 编码规则适用于预处理后的代码。当条件为假时,不会报告条件预处理器模块中的规则违规。例如,请参考以下代码:
#ifdef MACRO_ACTIVATION_1 typedef unsigned char activation_by_macro_uchar; //Unused type #endif
MACRO_ACTIVATION_1
,则预处理代码中不会出现 #ifdef
模块中的代码。在这种情况下,不会报告该行中的 MISRA C 编码违规。另请参阅
不为 (-do-not-generate-results-for) 生成结果
| -code-behavior-specifications
| -consider-analysis-perimeter-as-trust-boundary
| -detect-atomic-data-race