tstream защищен от переполнения буфера?
TStream - это абстрактный класс.
Однако о его реализации, они являются доказательством переполнения буфера?
Если я получаю поток из Интернета, из не принадлежащего мне источника, как я могу убедиться, что он не поврежден и не вызывает переполнение буфера?
Допустим, поток является XML-файлом.
редактировать: все ответы указывают на необходимость проверки на переполнение буфера. Не могли бы вы продемонстрировать, как проверить переполнение буфера во входном файле, где мы знаем, что поток может быть бесконечным по своему определению?
4 ответа
TStream
и его различные потомки RTL не имеют каких-либо ошибок, которые приводят к переполнению буфера, насколько мне известно.
Однако ваш код, использующий потоки Delphi, может легко переполнить буфер.
TStream
читает в любой буфер, который поставляет вызывающая сторона. Вызывающая сторона должна убедиться, что предоставленный буфер и его размер верны.
Нет, потомки TStream не являются "доказательством переполнения". Но если вы последуете советам Реми и NGLN, вы напишете код, максимально безопасный для потоков Delphi.
Если вы боитесь чего-то злонамеренного, обработайте его с помощью попытки / исключения и / или попытки / окончательно заблокировать и устранить любой потенциальный ущерб.
Правильное использование try является ключом к безопасному программированию на Delphi - здесь нет серебряных пуль. Это цена, которую вы платите, когда используете компилируемый язык, и которая позволяет вам "приблизиться к металлу".
Обычно вы должны зависеть от Size
свойство представленного потока, чтобы установить размер вашего собственного буфера перед его заполнением. Единственная причина для этого Size
собственность, не предоставляющая реальный размер, была бы неправильной реализацией Seek
методы. Если этот метод не определяет размер потока при странных допущениях о границе, один тест должен исключить любые проблемы.
В любом случае, содержит ли поток поврежденные данные или нет, он никогда не должен сталкиваться с переполнением буфера на вашей стороне, если вы просто не загружаете больше, чем размер вашего собственного буфера.
Вы также можете запросить тип представленного потока и проверить, является ли он стандартным потоком Delphi. Если это так, то вам не нужно беспокоиться.