主要内容

诊断为何编码规范违规未按预期显示

问题

您预计某行代码存在编码违规,但 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。如果您预计宏会出现编码违规:

窗格中,要查看一行是否包含宏扩展,请查找 图标。

检查编译错误

如果分析中的任何源文件无法编译,则代码规范检查将不完整。编码规则检查项的结果:

  • 可能不包含未编译文件的完整结果。

  • 可能不包含已编译文件的完整结果,因为某些规则仅在编译完成后才会进行检查。

检查编译错误。请参阅View Error Information When Polyspace Analysis Stops

检查规则检查项是否需要扩展

您代码中的某些结构在特定情况下可能会违反编码规则。默认的 Bug Finder 分析可能不会报告这些潜在违规情况,以减少误报。通过扩展现有的 Bug Finder 编码规则检查项来检测这些问题。使用以下选项修改检查项的行为:

有关扩展或修改 Bug Finder 检查项的选项列表,请参阅 Modify Default Behavior of Bug Finder Checkers

检查分析是否需要有关代码的额外信息

Polyspace 可能需要有关您代码的更多信息来检测某些编码违规。例如:

有关需要您提供代码附加信息的检查项的完整列表,请参阅 Modify Default Behavior of Bug Finder Checkers

检查规则是否适用于源文件

某些编码规则仅适用于头文件。违反这些规则的情况不会在非头文件源文件中报告。例如,违反 MISRA C++:2008 Rule 3-1-1AUTOSAR 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 编码违规。

另请参阅

| | |

主题