c - 如何使用 sscanf() 处理 SECURE_CODING 隐蔽错误?
问题描述
Coverty 为 sscanf() 提供以下错误:
char charnum[15] = "429496725";
char copystrpointer[15] = {0};
int intequal = 0;
/* Event secure_coding: [VERY RISKY]. Using "sscanf(char const * restrict, char const * restrict, ...)" can cause a buffer overflow when done incorrectly. sscanf() assumes an arbitrarily large string, so callers must use correct precision specifiers or never use sscanf(). Use correct precision specifiers or do your own parsing.*/
sscanf (charnum, "%10s", copystrpointer);
/*Event secure_coding: [VERY RISKY]. Using "sscanf(char const * restrict, char const * restrict, ...)" can cause a buffer overflow when done incorrectly. sscanf() assumes an arbitrarily large string, so callers must use correct precision specifiers or never use sscanf(). Use correct precision specifiers or do your own parsing.*/
sscanf (charnum, "%4d", &intequal);
这个错误基本上是因为 sscanf() 的读写没有界限,会越过数组限制导致程序崩溃。
由于隐蔽本身提到使用精度说明符来解决这个问题,在上面的示例中使用了宽度说明符,据我了解,这应该只读取 10 个字节,最多写入 10 个字节。所以它不应该跨数组绑定并且应该是安全的。在第二个示例中,4 字节是最大值,因为这是我单位中的整数范围。
但仍然存在隐蔽错误。根据我的理解,精度说明符仅适用于 float 和 double 格式说明符(例如:%f)而不适用于 int(%d)。
我可以看到有人建议使用替代函数来处理这个问题,但想使用 sscanf() 来解析一些正常的字符串。
请让我知道秘密提到的这个精度说明符是什么?有没有办法处理这个错误?
解决方案
推荐阅读
- facebook - Facebook Limited 登录并在会话之间保留访问令牌
- database - 是否可以使用 BASE-fashioned 数据库实现 Exacly Once Semantics?
- sql - 数字数据类型 oracle 的默认值的正确格式
- laravel - laravel 集体选择的默认值
- javascript - 过渡不适用于 div - vanilla js 手风琴
- regex - 赛普拉斯断言失败,包含方法的正则表达式
- firebase - 使用 Firebase 函数创建、访问和读取日志的最佳方式
- java - 应用程序在重启时重新消费整个 Kafka 主题
- r - 从表格格式到列表
- html - 元素网格定位