Моя группа проверки программного обеспечения проверяет фрагмент кода следующим образом:
unsigned int alarm_id;
char alarm_text[16];
static const char text_string[] = "105, Water_Boiling";
signed int arguments_satisfied =
sscanf(text_string,
"%3d, %16s",
&alarm_id, &alarm_text[0]);
if (arguments_satisfied < 2)
{
system_failure();
}
Используя вышеприведенный фрагмент кода, есть ли способ заставить sscanf
вернуть значение больше 2 без изменения спецификатора формата или изменения аргументов в sscanf
?
Они выполняют выражение if
, используя единичный инструмент тестирования.
Для C++ существуют ли какие-либо различия с указанным выше фрагментом при компиляции как C++?
(Мы планируем использовать тот же код, но компилируем его как C++.)
FYI, мы используем процессор ARM7 с IAR Embedded Workbench.
sscanf возвращает количество преобразованных аргументов. Он не может преобразовать больше аргументов, чем вы говорили. Поэтому, если строка формата не изменена, sscanf не может вернуть значение больше 2. Одно из возможных исключений - возможно, что EOF может быть возвращен, если у вас закончились данные до преобразования первого аргумента, но я подозреваю, что только применяется к scanf, а не sscanf.
Для многих наборов инструментов (и я уверен, что IAR - один), если у вас есть символ в объектном файле и в библиотеке, компоновщик будет ссылаться на объект в объектном файле, отличный от того, который находится в библиотеке.
Таким образом, вы можете предоставить свою собственную функцию sscanf()
для ссылки во время тестов и вернуть ее, как вам нравится.
Если у компоновщика возникла проблема с конфликтом символа между вашей реализацией sscanf()
и одним в библиотеке, а альтернативой, которая может работать, является то, что вы используете единичный тест sscanf()
используя другое имя (например, unittest_sscanf
) и имеете систему сборки определить макрос, чтобы переименовать sscanf()
во время сборки, используя что-то вроде /Dsscanf=unittest_sscanf
для /Dsscanf=unittest_sscanf
модуля.
Конечно, может быть сложно проверить, что другие вызовы sscanf()
, которые не тестируются, не создают проблем.
sscanf
для юнит-тестирования.
text_string
когда-либо имеетtext_string
16 или более символов, формат%16s
будет писать'\0'
сразу после конца массиваalarm_text
. Массивalarm_text
должен содержать 17 элементов или спецификатор формата должен быть%15s
.