sscanf被认为是安全的吗?

nmi*_*els 15 c security scanf buffer-overflow

我对那些sscanf糟糕的建议有着模糊的回忆.我知道如果我使用字段宽度说明符,它不会溢出缓冲区,所以我的记忆只是在玩弄技巧吗?

Meh*_*dad 8

我认为这取决于你如何使用它:如果你正在扫描类似的东西int,那很好.如果你正在扫描一个字符串,它不是(除非有一个我忘记的宽度字段?).


编辑:

扫描字符串并不总是安全的.

如果缓冲区大小是常量,那么你当然可以将它指定为类似的东西%20s.但如果它不是常量,则需要在格式字符串中指定它,并且您需要执行以下操作:

char format[80]; //Make sure this is big enough... kinda painful
sprintf(format, "%%%ds", cchBuffer - 1); //Don't miss the percent signs and - 1!
sscanf(format, input); //Good luck
Run Code Online (Sandbox Code Playgroud)

这是可能但容易出错,就像我在之前的编辑中所做的那样(忘了处理空终止符).您甚至可能溢出格式字符串缓冲区.

  • @ 0verbose:我认为问题是你*不能*总是指定字符串宽度,因为它并不总是一个常数.如果它是一个变量,你必须通过像'sprintf`之类的东西来构造格式字符串,这是大多数人不想要经历的痛苦. (2认同)