主要内容

MISRA C:2012 Rule 8.7

R2026b

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 as You Code)。

规则定义

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

理由

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

Polyspace 实现

规则检查项会标记:

  • 在未使用 static 设定符的情况下在文件作用域内定义,但仅在一个文件中使用的对象。

  • 在未使用 static 设定符的情况下定义,但仅在一个文件中调用的函数。

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

如果您使用输入 (-variables-written-in-loop) 和参数 (-variables-written-before-loop) 等选项,并将值设为 custom 以显式指定一组要初始化的变量,则检查项不会标记这些变量。检查项假定在实际应用中,除了当前使用这些变量的任何文件之外,包含 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 类别:建议
PQL 名称:std.misra_c_2012.R8_7

版本历史记录

在 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:2025

  • MISRA C++:2008

  • MISRA C++:2023

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