MISRA C:2012 Dir 4.14
应检查从外部来源获得的值的有效性。
描述
理由
来自外部源的值可能会因错误或攻击者的故意修改而无效。在使用数据之前,您必须先验证数据的有效性。
例如:
在将外部输入用作数组索引之前,必须检查该输入是否可能会导致数组边界错误。
在使用外部变量控制循环之前,必须检查该变量是否可能导致无限循环。
Polyspace 实现
规则检查项会检查以下问题:
在需要以空字符结尾的字符串中使用外部获得的字符串,且该字符串没有空字符。此类使用可能导致未定义行为。例如,在此代码中,函数
printf()
期望字符串以空字符结束。使用未以空字符终止的字符数组str
会导致未定义的行为。char str[10]; scanf("%10c", str); printf("%s",str);//Null terminated string expected
使用从外部获得的不确定字符串。例如,如果您调用
fgets()
系列函数来设置字符串的值,但函数调用失败,则该字符串可能为未确定值:因为函数char buffer[10]; fgets(buffer, sizeof(buffer), stdin); //buffer is indeterminate if fgets() fails printf("%s",buffer); // Possible undefined behvior
printf()
期待一个以空字符结尾的字符串,所以在这个函数中使用buffer
会导致未定义的行为。
故障排除
如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示。
示例
检查信息
组:代码设计 |
类别:必需 |
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.