首页 > 解决方案 > 如何使用 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() 来解析一些正常的字符串。

请让我知道秘密提到的这个精度说明符是什么?有没有办法处理这个错误?

标签: cscanfsecure-coding

解决方案


推荐阅读