Есть ли действительно безопасная библиотека форматирования для C? - PullRequest
2 голосов
/ 10 мая 2009

Принимая во внимание ответы на вопрос о более безопасных библиотеках форматирования для C, мне интересно, существует ли safe C библиотека форматирования

Что я имею в виду:

  • нет возможности несовпадения строки формата с аргументами
  • невозможность сбоя при передаче неверного типа
  • нет зависимых от платформы аспектов

Пожалуйста, не отвечайте о Microsoft Safe String Library или библиотеках, которые менее небезопасны , но, тем не менее, не совсем безопасны, насколько я знаю, и они не не удовлетворяют требованиям общей безопасности.

Заранее спасибо

Ответы [ 3 ]

6 голосов
/ 10 мая 2009

Вы пишете на языке C. C не является типобезопасным. Вы не можете избежать неопределенного поведения, если передаете int* вместо char*. Нет такой вещи, как «нет возможности», если ваши переменные не проверяются статически на тип / помечены для проверки во время выполнения.

Если у вас есть что-то, что выдает предупреждения, это уже неплохо ...

Если вам действительно нужен или вам нужна безопасность, вы можете взглянуть на циклон (диалект С) или на несколько совершенно разных языков.

5 голосов
/ 10 мая 2009

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

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

Можно иметь такой интерфейс:

typedef ... FORMATTER;

FORMATTER create_formatter();
int fmt_add_string_default(FORMATTER f, const char *s);
int fmt_add_string(FORMATTER f, const char *s, int maxlength, const char fill, enum fmt_alignment align);
...
int fmt_add_decimal_default(FORMATTER f, int d);
... // you get the idea
int fmt_write_result(FORMATTER f, char *out, int out_length);
void destroy_formatter(FORMATTER f);

Нечто подобное было бы совершенно безопасно, если бы оно было многословным.

1 голос
/ 10 мая 2009

Нет, потому что любая «безопасность», которую вы вводите, может быть подчинена языку. Это все равно что строить свой замок на песке - не важно, насколько хорош замок, его все равно можно упасть, если вы выкопать песок из-под него.

В C нет механизма принудительного применения определенных типов параметров, и не должно быть.

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

...