получение ошибки scanf без ограничений ширины поля может привести к сбою с огромными входными данными в некоторых версиях libc

При выполнении cppcheck cppcheck показывает «недействительный scanf» и говорит:

scanf без ограничений ширины поля может привести к сбою с огромными входными данными в некоторых версиях libc.

Дает ли это какой-либо сбой для моей программы? Как избавиться от этой проблемы?

   int a;
   char str[32];
   int part[4];
   // after this i am storing some string in 'str'.
   a = sscanf(str, "%d%d%d%d", &part[0], &part[1], &part[2], &part[3]); // here i am getting that cppcheck portability error.

person Rambabu G    schedule 13.04.2016    source источник


Ответы (2)


Как избавиться от этой проблемы

Путем написания C++, а не C, и использования инструментов стандартной библиотеки C++, а не устаревших и часто небезопасных инструментов стандартной библиотеки C.

#include <iostream>
#include <sstream>

void test()
{
   std::string str("4 5 6 7");
   int part[4];

  std::istringstream ss(str);
  ss >> part[0]
    >> part[1]
    >> part[2]
    >> part[3];

}
person Richard Hodges    schedule 13.04.2016

То, что вы получаете, является просто предупреждением: некоторые реализации libc могут дать сбой, если, скажем, вы дадите слишком длинные строки %s и т. д. CPPCheck рекомендует вам использовать другие, типобезопасные методы C++ для достижения вашей цели (например, потоки и std:: преобразователи to_string() и т. д.)

person Ahmet Ipkin    schedule 13.04.2016