tstream защищен от переполнения буфера? - PullRequest
0 голосов
/ 15 сентября 2011

TStream - абстрактный класс.

Однако, что касается его реализаций, они защищены от переполнения буфера?

Если я выбираю поток из Интернета, из не принадлежащего мне источника, как я могу убедиться, что он не поврежден и не вызывает переполнение буфера?

Допустим, поток является XML-файлом.

редактирование: все ответы указывают на необходимость проверки на переполнение буфера. Не могли бы вы продемонстрировать, как проверить переполнение буфера во входном файле, если мы знаем, что поток может быть бесконечным по определению?

Ответы [ 4 ]

5 голосов
/ 16 сентября 2011

TStream считывает в любой буфер, предоставленный вызывающей стороной. Вызывающий должен убедиться, что предоставленный буфер и его размер верны.

5 голосов
/ 15 сентября 2011
Насколько мне известно,

TStream и его различные потомки RTL не имеют ошибок, которые приводят к переполнению буфера.

Однако ваш код, использующий потоки Delphi, может легко переполнить буфер.

1 голос
/ 16 сентября 2011

Нет, потомки TStream не являются "защищенными от переполнения". Но если вы последуете советам Реми и NGLN, вы напишете код, максимально безопасный для потоков Delphi.

Если вы боитесь чего-то злонамеренного, обработайте его с помощью попытки / исключения и / или попытки / наконец-то заблокировать и устранить любой потенциальный ущерб.

Правильное использование try является ключом к SAFE Программирование Delphi - серебряных пуль нет. Это цена, которую вы платите, когда используете компилируемый язык, и которая позволяет вам «приблизиться к металлу».

1 голос
/ 15 сентября 2011

Обычно вы должны зависеть от свойства Size представленного потока, чтобы установить размер вашего собственного буфера перед его заполнением. Единственной причиной того, что свойство Size не обеспечивает реального размера, будет неправильная реализация любого из методов Seek. Если этот метод не определяет размер потока при странных допущениях на границе, один тест должен исключить любые проблемы.

В любом случае, содержит ли поток поврежденные данные или нет, он никогда не должен сталкиваться с переполнением буфера на вашей стороне, если вы просто не загрузите больше, чем размер вашего собственного буфера.

Вы также можете запросить тип представленного потока и проверить, является ли он стандартным потоком Delphi. Если это так, то вам не нужно беспокоиться.

...