В качестве примера применения предложенного метода маскировки мы выбрали небольшую программу, которая решает задачу о 8 ферзях. Текст этой программы приведён на рис. 10.

Рис. 10. Программа, решающая задачу о "8 ферзях"
Для маскировки мы выберем основную функцию queens этой программы. Граф потока управления функции queens приведён на рис. 11.

Рис. 11. Граф потока управления функции queens
Результат маскировки функции queens приведён ниже.
static void queens(int c)
{
int q[13u];
q[10] = 0;
q[8] = 0;
q[1] = (c + 7);
q[4] = 0;
q[7] = 0;
q[2] = -1;
q[11] = 0;
L127: if (!q[2]) goto L128;
q[11]++;
q[2] = (unsigned) q[2] >> 1;
goto L127;
L128: q[12] = q[11]+q[2]-19;
q[11] = q[11] % q[12];
L111:
if (q[q[11]+4] >= 8) goto L45;
q[3] = q[10];
q[q[11]+2] = ((q[8] + q[7]) + 1);
q[9] = (q[10] + 1);
q[1] = ((q[1] + c) + 2);
q[q[11]+4] = (q[10] + 2);
q[7] = ((7 + q[q[11]+2]) - q[1]);
if ((v3)[q[3]] == 0) goto L94;
q[4] = ((v8)[q[3]] + (v2)[((q[3] - c) + 7)]);
if ((v7)[((q[3] - c) + 7)] == 0) goto L94;
if (q[7] < 0) goto L96;
if (q[7] <= 7) goto L97;
L96:
q[7] = ((q[3] - c) + 7);
L97: if ((v4)[(q[3] + c)] == 0) goto L94;
q[1] = (q[8] + (v2)[q[7]]);
q[2] = (((c * (c + 1)) * q[3]) % 4);
goto L99;
L122: if (q[5] <= 0) goto L101;
(v4)[(q[3] + c)] = 0;
(v2)[((q[3] - c) + 7)] = 0;
(v7)[((q[3] - c) + 7)] = 0;
(v3)[q[3]] = 0;
(v5)[c] = q[3];
(v8)[c] = q[q[11]+2];
q[5] = ((q[5] + 1) != 2);
goto L102;
L101: q[7] = (q[7] + 2);
if (q[7] <= 14) goto L103;
q[7] = (q[3] + c);
L103: q[4] = (v2)[q[7]];
(v4)[(q[3] + c)] = 0;
q[1] = 0;
(v7)[((q[3] - c) + 7)] = 0;
(v8)[q[3]] = q[1];
(v3)[q[3]] = 0;
(v5)[c] = q[3];
q[5] = ((q[5] + 4) != 5);
q[1] = (v8)[c];
L102: if (c != 7) goto L105;
L104: print();
q[4] = ((c * 5) + 4);
q[q[11]+2] = (v8)[c];
(v8)[c] = q[4];
goto L106;
L105: q[q[11]] = ((c * 5) + 3);
(v2)[((q[3] - c) + 7)] = ((q[8] + q[1]) - 7);
L115:
if ((q[6] % 5) < 2) goto L108;
q[4] = ((q[q[11]] % 5) + c);
if ((q[4] % 7) != 0) goto L109;
q[4] = 1;
L109: q[1] = ((q[4] * q[4]) % 7);
q[1] = ((q[1] * q[1]) * q[1]);
c = ((c + (q[1] % 7)) - 1);
queens(((c + 1)));
q[11] = (q[q[11]+5] + q[12]) % 13;
L106: (v4)[(q[3] + c)] = 1;
(v2)[(q[3] + c)] = q[q[11]+2];
(v7)[((q[3] - c) + 7)] = 1;
(v8)[q[3]] = 1;
(v3)[q[3]] = 1;
q[4] = (((v2)[(q[3] + c)] + c) + 7);
L94: q[1] = (q[4] > 5);
if ((v3)[q[9]] == 0) goto L111;
if ((v7)[((q[9] - c) + 7)] != 0) goto L112;
if (q[1] != 0) goto L111;
if (q[4] <= 5) goto L111;
L112: if ((v4)[(q[9] + c)] == 0) goto L111;
q[6] = (((q[9] + c) * 5) + 1);
q[1] = ((q[q[11]] + q[8]) + 1);
goto L115;
L108: (v2)[((q[9] - c) + 7)] = q[5];
(v4)[(q[9] + c)] = 0;
(v8)[q[9]] = (v3)[q[9]];
(v7)[((q[9] - c) + 7)] = 0;
q[7] = (q[9] + c);
(v3)[q[9]] = 0;
q[8] = ((q[5] + q[2]) + 7);
(v5)[c] = q[9];
(v8)[c] = q[q[11]+2];
if (c != 7) goto L117;
L116: print();
q[1] = (v8)[c];
(v8)[c] = q[4];
goto L118;
L117: (v8)[(c + 1)] = q[1];
queens(((c + 1)));
L118: q[8] = ((v2)[(q[9] + c)] + q[1]);
q[1] = ((q[8] + q[7]) + q[5]);
if (((v1)[((((q[9] - c) + 7) ^ q[5]) % 4)] % 4) != 1) goto L120;
(v2)[((q[9] - c) + 7)] = ((q[7] + q[9]) - c);
(v4)[(q[9] + c)] = 1;
q[4] = (q[q[11]+2] + 1);
(v8)[q[9]] = 1;
(v7)[((q[9] - c) + 7)] = 1;
(v3)[q[9]] = 1;
q[11] = (q[11] + q[q[11]+6]) % 13;
goto L111;
L120: q[2] = ((((v7)[(q[9] - c)] + 7) | 1211) % 6);
q[4] = (q[8] + ((v7)[(q[9] - c)] | 1211));
q[7] = (q[7] + 1);
L99: if ((v6)[q[2]] > (v6)[(q[2] + 1)]) goto L122;
(v2)[(q[9] + c)] = ((v6)[q[2]] + c);
q[8] = (((q[1] + q[4]) + q[9]) - 7);
(v4)[(q[9] + c)] = 1;
q[4] = (v8)[q[9]];
(v8)[q[9]] = 1;
(v7)[((q[9] - c) + 7)] = 1;
q[7] = (q[7] - 1);
(v3)[q[9]] = 1;
q[q[11]+5] = (q[11] + q[12]) % 13;
goto L111;
L45: ;
}
Граф потока управления замаскированной функции приведён на рис. 12. На рисунке графа дуги, получившиеся при выполнении преобразования зацепления дуг, имеют большую толщину, а соответствующие базовые блоки выделены серым цветом.

Рис. 12. Граф потока управления замаскированной функции queens
В таблице 1 приведены метрики сложности кода для исходной функции queens и для её замаскированного варианта. У замаскированной функции значения всех метрик, кроме метрики сложности графа вызовов выше, чем у исходной функции. Принципы предлагаемого метода маскировки нашли отражение в примере следующим образом:
| Таблица 1. Изменение метрик сложности для замаскированной функции queens | ||
| метрика | исходная функция | после преобразования |
| CC (Цикломатическая сложность) [14] | 6 | 21 |
| FC (Сложность по связям) [13] | 9 | 27 |
| GC (Сложность графа вызовов) | 2 | 2 |
| SC (Структурная сложность) [13] | 3 | 24 |
| YC (Зацикленность) | 0.595 | 0.8119 |
| DC (Сложность потока данных) | 82 | 8964 |
В работе представлен новый метод маскировки программ, который обладает следующими отличительными особенностями.