я и мой друг в последнее время обсудили, может ли следующее привести к переполнению буфера.
Я знаком с общими функциями 'sscanf', с которыми я сталкивался. Но мне кажется, что это немного связано со мной, потому что я не уверен, как интерпретировать спецификатор форматирования '%' INT64_FMT в этом случае, и что 'sscanf' будет писать в бит 'first' и 'second'.
У кого-нибудь есть идея?
static int hKCMF_SLC(const char *content, int64_t *first, int64_t *second)
{
return sscanf(content, "Size=%" INT64_FMT "-%" INT64_FMT, first, second);
}
При попытке написать переносимый код спецификатор формата для int64_t
может отличаться на разных платформах. Int64_t может быть typedef
для нескольких типов, включая int
, long
или long long
.
Чтобы обойти эту проблему, мы создаем макросы, которые содержат правильный спецификатор формата. В последних версиях стандартов C и C++ вы можете использовать inttypes.h
для получения этих макросов. Но для более ранних систем людям нужно было делать это вручную.
Поэтому INT64_FMT
, вероятно, определяется как нечто вроде:
#define INT64_FMT "lld"
Что вызовет вызов функции (после предварительной обработки):
return sscanf(content, "Size=%" "lld" "-%" "lld", first, second);
Мы можем объединить соседние строковые литералы в один строковый литерал:
return sscanf(content, "Size=%lld-%lld", first, second);
Пусть сделают некоторые предположения:
content
указывает на строку с нулевым завершением.first
указывает на int64_t
.second
указывает на int64_t
.INT64_FMT
- это макрос, который имеет то же значение, что и SCNi64
из inttypes.h
.Тогда переполнение буфера не будет.
Поэтому, если входной сигнал является чем-то вроде "Size=4-3"
, тогда мы будем хранить 4
в first
и 3
second
.
Как правило, переполнение буфера происходит от записи за конец массива. Вы на самом деле не записываете какие-либо массивы здесь, поэтому переполнение буфера не должно происходить.
Другие ошибки (ошибка сегментации, переполнение стека) могут возникнуть, если предположения не будут сохранены.
content
не указывает на строку с нулевым символом в конце, вы можете получить ошибку сегментации, но не переполнение буфера.
content
не заканчивается нулем. Например, Heartbleed был назван «переполнением буфера» ( nakedsecurity.sophos.com/2014/04/08/… )
INT64_FNT
:INT64_FNT
#ifdef unix #define INT64_FMT "%lld" #else #define INT64_FMT "%I64d" #endif