Существует ли по-настоящему безопасная библиотека форматирования для C?

StackOverflow https://stackoverflow.com/questions/844319

  •  20-08-2019
  •  | 
  •  

Вопрос

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

Я имею в виду:

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Если вам нужна строка формата, без специальной поддержки компилятора вы в принципе не сможете этого сделать.Тем не менее, у вас может быть безопасная библиотека форматирования на 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);

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top