Как безопасно использовать функции форматирования C?C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Как безопасно использовать функции форматирования C?

Сообщение Гость »

В 64-битной версии Linux и Windows MinGW, скорее всего, имеет ширину 64 бита. В 64-разрядной версии Visual Studio длина имеет ширину 32 бита. Предположим, у меня есть фиксированный целочисленный тип, 32-битный или 64-битный, и когда я вызываю что-то вроде printf(), мне нужно указать, какой тип считывается. Если я ошибаюсь, это UB. Таким образом, мой 32- или 64-битный тип не является конкретно int, или long, или long long, а типизирован для бог знает чего.
int32_t my_number;

fprintf("%l", my_number); // LONG IS STIPULATED TO BE "AT LEAST" 32-BITS BUT NOT GUARANTEED

int64_t my_number;

fprintf("%ll", my_number); // LONG LONG IS STIPULATED TO BE "AT LEAST" 64-BITS BUT NOT GUARANTEED

То же самое относится и к другим функциям, таким как ltoa(). Я предполагаю, что проблема заключается в том, что с точки зрения функции она знает только «указатель» и просто работает на всех парах в зависимости от того, какую функцию вызвал программист, это кажется действительно сумасшедшим, подверженным ошибкам и опасным, не говоря уже о том, что что-то вроде того, что если вы измените один из ваших типов где-нибудь в вашем коде, везде, где вызываются эти функции, ваш компьютер просто взорвется.
  • Как обстоят дела? вы должны использовать эти функции, учитывая несоответствие типов и их собственных размеров?
  • Как вы должны справляться с реальностью, в которой вы можете изменить где-нибудь свой тип?
Должен ли я вообще использовать эти функции? Люди Rust твердят о том, насколько небезопасен C++, но по сравнению с этим это утопический рай, обернутый пузырями. Обычно я программирую на C++, не лучше ли просмотреть все типы и шаблонизировать все до чертиков, чтобы каждый тип вызывал функцию записи? Повлечет ли это за собой проверку чего-то вроде:
Вот так:
template
void value_to_ascii(const char* buffer, int max_size, const T& val)
{
if constexpr(std::is_same_v)
ltoa();
else if constexpr(std::is_same_v)
itoa();
}


Подробнее здесь: https://stackoverflow.com/questions/784 ... ons-safely
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»