我知道缓冲区溢出是使用C风格字符串(char数组)的一个潜在危险.如果我知道我的数据适合我的缓冲区,是否可以使用它们?我还需要注意C风格字符串固有的其他缺点吗?
编辑:这是一个接近我正在做的事情的例子:
char buffer[1024];
char * line = NULL;
while ((line = fgets(fp)) != NULL) { // this won't compile, but that's not the issue
// parse one line of command output here.
}
Run Code Online (Sandbox Code Playgroud)
此代码从使用popen("df")命令创建的FILE指针获取数据.我正在尝试运行Linux命令并解析其输出以获取有关操作系统的信息.以这种方式将缓冲区设置为任意大小是否有任何错误(或危险)?
Wal*_*ght 20
C字符串有一些缺点:
efo*_*nis 16
C字符串缺少C++对应的以下方面:
好吧,为了评论您的具体示例,您不知道调用df返回的数据是否适合您的缓冲区.永远不要相信未经过传真的输入到您的应用程序中,即使它应该来自像df这样的已知来源.
例如,如果名为"df"的程序放在搜索路径中的某个位置,以便执行它而不是系统df,则可以使用它来利用缓冲区限制.或者如果df被恶意程序替换.
从文件读取输入时,使用一个允许您指定要读取的最大字节数的函数.在OSX和Linux下,fgets()实际上被定义为 char *fgets(char *s, int size, FILE *stream);在这些系统上使用它们是安全的.