主要内容

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

MISRA C:2012 Dir 4.14

应检查从外部来源获得的值的有效性。

描述

指令定义

应检查从外部来源获得的值的有效性。 1

此规则来自 MISRA C™:2012 Amendment 1。

理由

来自外部源的值可能会因错误或攻击者的故意修改而无效。在使用数据之前,您必须先验证数据的有效性。

例如:

  • 在将外部输入用作数组索引之前,必须检查该输入是否可能会导致数组边界错误。

  • 在使用外部变量控制循环之前,必须检查该变量是否可能导致无限循环。

Polyspace 实现

规则检查项会检查以下问题:

故障排除

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

示例

全部展开

#include <stdio.h>

void f1(char from_user[])
{
        char input [128];
        (void) sscanf (from_user, "%128c", input);
        (void) sprintf ("%s", input);/*Noncompliant*/
}

在此示例中,sscanf 语句不合规,因为没有检查用户输入是否以空字符结束。随后输出字符串的 sprintf 语句可能会导致数组边界错误(缓冲区溢出)。

在此示例中,函数 scanf()fgets() 读取两个 char 数组,然后通过调用 printf() 打印这些数组。由于输入字符串是从外部获得的,因此它们可能不确定或缺少终止字符。使用 printf() 打印此类字符串会导致未定义的行为。Polyspace® 会报告违反此规则的情况。


#include <stdio.h>
void echo_in() {
       //...
    char buffer[10];
    scanf("%10c", buffer);
	//...
    printf("%s", buffer); //Noncompliant - buffer is not null-terminated
	//...
    fgets(buffer, sizeof(buffer), stdin);
      //...
    printf("%s",buffer); //Noncompliant - buffer might be indeterminate
}

检查信息

组:代码设计
类别:必需
AGC 类别:必需

版本历史记录

在 R2017a 中推出

全部展开


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.