非贪婪扫描和缓冲区溢出检查c

时间:2011-04-12 04:12:29

标签: c c99 buffer-overflow

我希望fscanf可以识别潜在的溢出时间,并且我无法理解如何做到这一点。

例如,对于包含字符串

的文件
**a**bb**cccc**

我做了

char str[10];
while (fscanf(inputf, "*%10[^*]*", str) != EOF) {

}

因为我保证**和**之间的差距通常小于10.但有时我可能会得到一个

**a**bb**cccc*

(没有最后一个*)甚至可能是缓冲区溢出。

我考虑过使用

while (fscanf(inputf, "*%10[^*]", str) != EOF) {

}

(没有最后的*)甚至

while (fscanf(inputf, "*%10s*", str) != EOF) {

}

但这将返回整个字符串。我试着看看我是否可以检查是否存在*,但我无法让它工作。我也见过fgets的实现,但我宁愿不要让它变得复杂。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

虽然fscanf()似乎被设计为通用表达式解析器,但很少有程序员依赖于这种能力。相反,使用fgets()读取文本行,然后使用您选择或设计的解析器来剖析文本缓冲区。

使用fgets()的全部功能在不同的实现上是狡猾的,并不总是提供完整的功能,甚至也没有正确实现。

答案 1 :(得分:2)

我不清楚你想要什么。是跳过任意数量的星星,然后将最多9个非星形字符读入缓冲区?如果是这样,试试这个:

void read_field(FILE *fin, char buf[10])
{
    int c;
    char *ptr = buf;
    while ((c = getc(fin)) == '*')
        /*continue*/;
    while (c != '*' && c != EOF && ptr < buf+9)
    {
        *ptr++ = c;
        c = getc(fin);
    }
    *ptr = '\0';
    /* skip to next star here? */
}

您会注意到我没有使用fscanf。那是因为fscanf几乎总是比它的价值更麻烦。以上是更多的打字,但我可以确信它是我所描述的那样。