Как обработать скрытую ошибку SECURE_CODING с помощью sscanf ()? - PullRequest
0 голосов
/ 06 февраля 2019

Corally дает следующую ошибку для sscanf ():

char charnum[15] = "429496725";
char copystrpointer[15] = {0};
int intequal = 0;

/* Event secure_coding:     [VERY RISKY]. Using "sscanf(char const * restrict, char const * restrict, ...)" can cause a buffer overflow when done incorrectly. sscanf() assumes an arbitrarily large string, so callers must use correct precision specifiers or never use sscanf(). Use correct precision specifiers or do your own parsing.*/

sscanf (charnum, "%10s", copystrpointer);

/*Event secure_coding:  [VERY RISKY]. Using "sscanf(char const * restrict, char const * restrict, ...)" can cause a buffer overflow when done incorrectly. sscanf() assumes an arbitrarily large string, so callers must use correct precision specifiers or never use sscanf(). Use correct precision specifiers or do your own parsing.*/

sscanf (charnum, "%4d", &intequal);

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

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

Но все еще сохраняется ошибка покрытия.Согласно моему пониманию, спецификатор точности возможен только для спецификатора float и double (например,% f), а не для int (% d).

Я вижу, что есть предложения использовать альтернативные функции для обработки, но хотел использовать sscanf () для анализа некоторых нормальных строк.

Пожалуйста, дайте мне знать, что это за спецификатор точности, который упоминает coverty?Есть ли способ справиться с этой ошибкой?

...