TStream 是一个抽象类。
然而,关于它的实现,它们是缓冲区溢出证明吗?
如果我从不是我的来源从 Internet 获取流,我如何验证它没有损坏并导致缓冲区溢出?
假设流是一个 xml 文件。
编辑:所有答案都表明您需要检查缓冲区溢出。您能否演示如何检查输入文件上的缓冲区溢出,我们知道根据其定义,流可能是无限的?
TStream 是一个抽象类。
然而,关于它的实现,它们是缓冲区溢出证明吗?
如果我从不是我的来源从 Internet 获取流,我如何验证它没有损坏并导致缓冲区溢出?
假设流是一个 xml 文件。
编辑:所有答案都表明您需要检查缓冲区溢出。您能否演示如何检查输入文件上的缓冲区溢出,我们知道根据其定义,流可能是无限的?
TStream
据我所知,它的各种 RTL 后代没有任何导致缓冲区溢出的错误。
但是,使用 Delphi 流的代码很容易溢出缓冲区。
TStream
读入调用者提供的任何缓冲区。调用者有责任确保提供的缓冲区及其大小有效。
通常,您应该Size
根据呈现流的属性来设置自己的缓冲区的大小,然后再填充它。该属性未提供实际大小的唯一原因是这两种方法Size
的错误实现。Seek
除非该方法根据奇怪的边界假设确定流的大小,否则单个测试应该排除任何问题。
在任何情况下,无论流是否包含损坏的数据,如果您下载的内容不超过您自己的缓冲区大小,则它永远不会在您这边遇到缓冲区溢出。
您还可以请求显示流的类型并验证它是否是标准 Delphi 流。如果是这样,那么您不必担心。
不,TStream 后代不是“溢出证明”。但是,如果您遵循 Remy 和 NGLN 的建议,您将使用 Delphi 流编写尽可能安全的代码。
如果您害怕恶意内容,请在 try/except 和/或 try/finally 中处理它并阻止并清除任何潜在的损坏。
正确使用“try”是SAFE Delphi 编程的关键——没有灵丹妙药。这是您使用编译语言所付出的代价,而不是让您“接近金属”。