Возможно переполнение на sscanf

0

я и мой друг в последнее время обсудили, может ли следующее привести к переполнению буфера.

Я знаком с общими функциями '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);
}
  • 0
    Я нашел это определение для INT64_FNT : INT64_FNT #ifdef unix #define INT64_FMT "%lld" #else #define INT64_FMT "%I64d" #endif
  • 0
    Что такое C ++?
Показать ещё 1 комментарий
Теги:

1 ответ

6

Вообще говоря:

При попытке написать переносимый код спецификатор формата для 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);

О вашем коде:

Пусть сделают некоторые предположения:

  1. content указывает на строку с нулевым завершением.
  2. first указывает на int64_t.
  3. second указывает на int64_t.
  4. INT64_FMT - это макрос, который имеет то же значение, что и SCNi64 из inttypes.h.

Тогда переполнение буфера не будет.

Поэтому, если входной сигнал является чем-то вроде "Size=4-3", тогда мы будем хранить 4 в first и 3 second.

В заключение:

Как правило, переполнение буфера происходит от записи за конец массива. Вы на самом деле не записываете какие-либо массивы здесь, поэтому переполнение буфера не должно происходить.

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

  • 0
    Кроме того, если content не указывает на строку с нулевым символом в конце, вы можете получить ошибку сегментации, но не переполнение буфера.
  • 0
    @Brian «переполнение буфера» - это неоднозначный термин, который можно использовать для обозначения того, что происходит, если content не заканчивается нулем. Например, Heartbleed был назван «переполнением буфера» ( nakedsecurity.sophos.com/2014/04/08/… )
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню