В некоторых случаях инструментальные средства сбора покрытия анализируют покрытие программного кода тестами не на уровне исходных текстов системы, а на уровне машинных инструкций. В этом случае степень покрытия зависит и от того, какой исполняемый код генерируется компилятором. Отчеты о покрытии в этом случае выглядят следующим образом (отчет о покрытии сгененирован при помощи отладчика Microtec XRAY для Motorola 680x0):
******* INSTRUCTION EXECUTION COVERAGE - Analyze Unit: Menu_Display
Function: DATA_PROCESSING\Menu_Display. Instruction(s) not executed:
5668 switch (Key)
0004A0F6 0352 BCHG D1,(A2)
0004A102 0466 0466 SUBI.W #$466,-(A6)
0004A106 0466 0466 SUBI.W #$466,-(A6)
0004A10A 0466 0466 SUBI.W #$466,-(A6)
0004A10E 0466 0466 SUBI.W #$466,-(A6)
0004A112 0466 0466 SUBI.W #$466,-(A6)
0004A116 0466 0474 SUBI.W #$474,-(A6)
5751 i = 1;
0004A4A6 7401 MOVEQ #$1,D2
Executed Total Percent Analyze-unit
467 475 98.32 DATA_PROCESSING\Menu_Display
0 unit(s) excluded.
******* BRANCH EXECUTION COVERAGE - Analyze Unit: Menu_Display
Function: DATA_PROCESSING\Menu_Display. Branch(es) not executed:
5612 if (First_Call == TRUE) { /* Only execute this block during th
00049E3A 6600 0722 BNE.W $4A55E Branch not taken.
5613 if (MP_Rd_Config_Straps (RAW_STRAPS, &Strap_Config) ==
00049E52 664A BNE.B $49E9E Branch not taken.
5750 if (i == 17)
0004A4A4 6602 BNE.B $4A4A8 Fall thru not taken.
Executed Total Percent Analyze-unit
|
|
74 77 96.10 DATA_PROCESSING\Menu_Display
0 unit(s) excluded.
Поскольку степень покрытия может меняться в зависимости от оптимизации при генерации кода, в некоторых случаях даже при полном выполнении всех операторов языка высокого уровня на котором написана программная система, не удается достичь полного покрытия на уровне исполняемого кода.
Например, в случае покрытия следующей конструкции на языке C:
typedef enum
{
CC1 = 250,
CC2 = 251,
CC3 = 252
} E_CC;
…
E_CC key;
…
switch (key) {
case CC1: printf(“CC1”); break;
case CC2: printf(“CC2”); break;
case CC3: printf(“CC3”); break;
}
компилятор Microtec C для Motorola 680x0 создаст таблицу возможных значений переменной key, в которой будут присутствовать все элементы от 0 до 255. Реально в программной системе возможно передать только значения констант CC1 – CC3, в результате покрытыми окажутся только три ветки из 255 возможных в исполняемом коде. Никакими стандартными средствами увеличить степень такого покрытия нельзя. В этом случае отчет о покрытии сопровождается дополнительной информацией о причинах невозможности обеспечить полное покрытие.
Сбор информации о покрытии на уровне исполняемого кода наиболее часто применяется в высококритичных программных системах, в которых не допускается наличия «мертвого» исполняемого кода, который потенциально может привести к сбою или отказу во время работы системы. К таким системам в первую очередь можно отнести авиационные бортовые системы, медицинские системы и системы обеспечения безопасности информации.