主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

MISRA C:2012 Rule 8.7

Functions and objects should not be defined with external linkage if they are referenced in only one translation unit

描述

默认 Polyspace® as You Code 分析中反激活了此检查项。请参阅Checkers Deactivated in Polyspace as You Code Analysis (Polyspace Access)

规则定义

Functions and objects should not be defined with external linkage if they are referenced in only one translation unit 1 .

理由

遵守此规则可避免您的标识符与另一个翻译单元或库中的相同标识符发生混淆。如果通过赋予对象内部链接或无链接来限制或减少对象的可见性,您或其他人就不会轻易无意中访问该对象。

Polyspace 实现

规则检查项标记:

  • 在文件范围内定义但未使用 static 指定符且仅在一个文件中使用的对象。

  • 未使用 static 指定符定义但仅在一个文件中调用的函数。

如果您打算只在一个文件中使用该对象或函数,请将其声明为静态。

如果您使用值为 custom 的选项(例如输入 (-variables-written-in-loop)参数 (-variables-written-before-loop) 来显式指定要初始化的一组变量,则检查项不会标记这些变量。检查项假设在实际应用中,除了当前使用这些变量的文件外,包含 main 的文件还必须初始化这些变量。因此,这些变量在多个翻译单元中被使用。

故障排除

如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

头文件:


/* file.h */
extern int var;

第一个源文件:


/* file1.c */
#include "file.h"

int var;    /* Compliant */
int var2;   /* Non compliant */
static int var3; /* Compliant */

void reset(void);

void reset(void) {
    var = 0;
    var2 = 0;
    var3 = 0;
}

第二个源文件:


/* file2.c */
#include "file.h"

void increment(int var2);

void increment(int var2) {
    var++;
    var2++;
}

在此示例中:

  • var 的声明是合规的,因为 var 被声明为外部链接,并在多个文件中使用。

  • var2 的声明不合规,因为 var2 被声明为外部链接,但只在一个文件中使用。

    可能看起来 var2 在两个文件中都已定义。然而,在第二个文件中,var2 是一个没有链接关系的参数,与第一个文件中的 var2 不同。

  • var3 的声明是合规的,因为 var3 使用内部链接(使用指定符 static)进行声明,并且只在一个文件中使用。

头文件:


/* file.h */
extern int var;
extern void increment1 (void);

第一个源文件:


/* file1.c */
#include "file.h"

int var;

void increment2(void);
static void increment3(void);
void func(void);

void increment2(void) { /* Non compliant */
    var+=2;
}

static void increment3(void) { /* Compliant */
    var+=3;
}

void func(void) {
    increment1();
    increment2();
    increment3();
}

第二个源文件:


/* file2.c */
#include "file.h"

void increment1(void) { /* Compliant */
    var++;
}

在此示例中:

  • increment1 的定义是合规的,因为 increment1 被定义为外部链接,并在另一个文件中被调用。

  • increment2 的声明不合规,因为 increment2 被定义为外部链接,但在同一文件中被调用,而其他地方未调用。

  • increment3 的声明是合规的,因为 increment3 被定义为内部链接(使用指定符 static),并且在同一文件中调用,未在其他地方调用。

在此示例中,函数 get_pi() 被声明为 extern,但该函数仅在一个翻译单元中使用。Polyspace 会报告违规情况。

extern double get_pi(void) // Noncompliant
{
    //....
    return 3.1416;
}

void foo(){
    
 get_pi(); 
}
更正 - 将 get_pi() 声明为 static

要修复此违规,请将函数 get_pi() 声明为 static 函数。

static double get_pi(void) // Compliant
{
    //....
    return 3.1416;
}

void foo(){
    
 get_pi(); 
}

检查信息

组:声明和定义
类别:建议
AGC 类别:建议

版本历史记录

在 R2014b 中推出


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.