字符值被吸收转化为 EOF
数据类型转换使有效的字符值与文件结尾 (EOF) 相同。
描述
当执行数据类型转换时,如果有效字符值与 EOF
(文件末尾)无法区分,就会出现此缺陷。在以下情况下,Bug Finder 会标记缺陷:
文件结尾:您执行数据类型转换,例如从
int
到char
,将非 EOF 字符值转换为EOF
。然后将结果与 EOF 进行比较。char ch = (char)getchar()
转换可以是显式的,也可以是隐式的。if((int)ch == EOF)
宽文件结尾:执行数据类型转换,将非 WEOF 宽字符值转换为 WEOF,然后将结果与 WEOF 进行比较。
风险
数据类型 char
不能保存表示文件结束的值 EOF
。诸如 getchar
之类的函数具有返回类型 int
,以适应 EOF
。如果将 int
转换为 char
,则值 UCHAR_MAX
(一个有效的字符值)和 EOF
将转换为相同的值 -1,从而无法区分彼此。当您将此转换的结果与 EOF
进行比较时,比较可能会导致错误地检测到 EOF
。此原理也适用于宽字符值和 WEOF
。
修复
在转换前,先使用 EOF
或 WEOF
进行比较。
示例
结果信息
组:编程 |
语言:C | C++ |
默认值:手写代码时为启动,生成代码时为关闭 |
命令行语法:CHAR_EOF_CONFUSED |
影响:高 |
版本历史记录
在 R2017a 中推出
另请参阅
查找缺陷 (-checkers)
| 无效的标准库整数例程使用
| 未检查敏感函数的返回值
| 未检查 errno
| 误用符号扩展字符值
主题
- 解释 Polyspace 桌面端用户界面中的 Bug Finder 结果
- 解释 Polyspace Access Web 界面中的 Bug Finder 结果 (Polyspace Access)
- 通过 Bug 修复或申述在 Polyspace 用户界面中处理结果
- 通过 Bug 修复或申述在 Polyspace Access 中处理结果 (Polyspace Access)