Представьте, что вы прочитали пароль:
{
char password[128];
if (fgets(password, sizeof(password), stdin) != 0)
{
password[strcspn(password), "\n\r"]) = '\0';
validate_password(password);
memset(password, '\0', sizeof(password));
}
}
Вы тщательно зарезали пароль, чтобы его нельзя было случайно найти.
К сожалению, компилятору разрешено пропускать этоmemset()
вызов, потому что password
снова не используется.Правило для memset_s()
означает, что вызов не может быть опущен;password
переменная должна * обнуляться независимо от оптимизации.
memset_s(password, sizeof(password), '\0', sizeof(password));
Это одна из немногих действительно полезных функций в Приложении K .(Мы можем обсудить преимущества повторения размера. Однако в более общем случае второй размер может быть переменной, а не константой, и тогда первый размер становится защитой во время выполнения от неуправляемой переменной.)
Обратите внимание, что это требование накладывается на компилятор, а не на библиотеку.Функция memset_s()
будет вести себя правильно, если она вызывается, точно так же, как memset()
будет вести себя правильно , если она вызывается.Обсуждаемое правило гласит, что компилятор должен вызвать memset_s()
, даже если он может пропустить вызов memset()
, поскольку переменная больше никогда не используется.