Обнаружение сбоя сканирования, когда строка формата заранее не известна

#c #scanf

#c #сканф

Вопрос:

Обычно я сравниваю возвращаемое число sscanf с количеством полей, описанных в строке формата, чтобы обнаружить сбой сканирования (полный или частичный).:

 if (sscanf(line, "%s: %d", name, amp;value) != 2)  errx(EX_USAGE, "cannot parse line %s", line);  

Однако что делать, если сама строка формата неизвестна до времени выполнения (скажем, она считывается из конфигурационного файла)?

В приведенном ниже примере формат может указывать до шести целых чисел, но, если он указывает меньше, это нормально-до тех пор, пока все, указанное в формате, на самом деле заполнено:

 int fields[6], fieldCount;   fieldCount = sscanf(line, format, fields, fields   1, fields   2,  fields   3, fields   4, fields   5);  

Как можно обнаружить, что fieldCount это не соответствует format … что строка ввода каким-то образом недействительна?

Я полагаю, я могу сосчитать все % символы в format (стараясь пропускать %% последовательности), но это кажется довольно утомительным. Есть ли другой способ?

Комментарии:

1. Добавьте еще одну переменную, содержащую количество полей формата, которые также должен предоставить поставщик строки формата.

2. Откуда на самом деле берутся струны? Где бы это ни было, также укажите количество ожидаемых совпадений.

3. Но это совершенно излишне-и подвержено несоответствиям… Неужели нет ничего лучше?

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

5. @MikhailT. Давайте отвлечемся от спора о безопасности. Файл конфигурации ни в коем случае не является надежным, если он не проверен с помощью какого-либо криптографического протокола. Никогда не передавайте строку формата, которая может быть изменена потенциальным злоумышленником. Кроме этого — нет другого способа, кроме как указать число или иметь побочный анализатор, который может интерпретировать строку и вывести количество спецификаторов.