Rahul VB Ответов: 3

Усекает ли sprintf дополнительные символы при переполнении буфера назначения?


Здравствуйте Друзья,

Я исправлял ошибку , связанную с sprintf, ниже приведен код:

float initial_temp_setpoint = 60;

sprintf(
bc_buffer, "\n\rVTM: NOT bc_vap_state_off: bc_cf_auto_vap_standby_enable: NOT bc_vap_standby_warmup_completed: warmup time=INC: setpoint<ALI3_STARTUP_COOL: initial_temp_setpoint from bc_vap_standby_temp=AT_ALI3_STARTUP_COOL_DEF_TEMP=%f",initial_temp_setpoint);


Примечание: bc_buffer-это глобальный массив символов размером 200. Однако, согласно приведенному выше коду sprintf записывает в него ~223 байта данных.

Я думал, что код рухнет, но этого не произошло, он напечатал вывод правильно, как показано ниже:

Цитата:
ВТМ: не bc_vap_state_off: bc_cf_auto_vap_standby_enable: не bc_vap_standby_warmup_completed: время прогрева=ИНК: заданное значение&ЛТ;ali3_startup_cool: initial_temp_setpoint="" от=""
bc_vap_standby_temp="AT_ALI3_STARTUP_COOL_DEF_TEMP=60.000000</blockquote">

Я ожидал аварии. Я думал исправить это с помощью snprintf, чтобы избежать переполнения памяти.

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

Может ли это поведение быть связано с компилятором?

Я бы запросил предложения.

Спасибо,
Рахул глаг

Что я уже пробовал:

Я опробовал приведенный выше код в eclipse и Visual studio, но он печатает всю строку, а не усекается.

Я также установил точку останова для просмотра данных bc_buffer, как показано ниже:

(x)=bc_buffer[197] char 83 'S'
(x)=bc_buffer[198] char 84 'T'
(x)=bc_buffer[199] char 65 'A'

Как вы можете видеть выше, последний charecter-это "A", а не нулевой charecter, тем не менее он печатает всю строку из 223 байт.

3 Ответов

Рейтинг:
1

OriginalGriff

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

В принципе, не делайте этого. Переполнение буфера приводит к непредсказуемым результатам - они могут даже не совпадать, если вы выполняете один и тот же код дважды! И помните, что переполнение буфера-это один из классических способов подрыва приложения ...


Рейтинг:
0

KarstenK

Нет, это не так. Это одна из основных проблем в C и часто является причиной бэкдора, сбоев и атак. По этой причине был разработан и внедрен snprintf. Это был эпический момент в жизни К. ;-)

Взгляните на это руководство за дополнительной информацией.


Рейтинг:
0

Richard MacCutchan

Гораздо лучшей версией для использования является sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l | Майкрософт документы[^].