主要内容

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

MISRA C:2012 Rule 8.6

An identifier with external linkage shall have exactly one external definition

描述

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

规则定义

An identifier with external linkage shall have exactly one external definition 1 .

理由

如果使用了在不同文件中存在多个定义或根本不存在定义的标识符,则行为未定义。

本规则不允许在不同文件中对同一术语进行多次定义,即使这些定义内容完全相同。

Polyspace 实现

检查项仅在定义出现在不同文件中时标记多个定义。

检查项不将暂定定义视为定义。例如,以下代码未违反该规则:

int val;
int val=1;

如果一个函数未被定义,但声明为外部链接并在源代码中被调用,则检查项不会显示违规。

故障排除

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

示例

全部展开

第一个源文件:


/* file1.c */
extern int var = 1; /* Non compliant */

第二个源文件:


/* file2.c */
int var = 0;   
在此示例中,全局变量 var 被多次定义。除非使用 static 修饰符显式指定,否则变量具有外部链接。

头文件:


/* file.h */
int func(int param);

第一个源文件:


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

int func(int param) { /* Non compliant */
    return param+1;
}

第二个源文件:


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

int func(int param) {  
    return param-1;
}

在此示例中,函数 func 被多次定义。除非使用 static 修饰符显式指定,否则函数具有外部链接。

检查信息

组:声明和定义
类别:必需
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.