Сгенерируйте автономный код, который обнаруживает и сообщает об ошибках времени выполнения

Этот пример показывает, как сгенерировать библиотеки C/C++ или исполняемые файлы, которые обнаруживают и сообщают об ошибках времени выполнения такой как за пределы индексация массива. Если сгенерированный код обнаруживает ошибку, он сообщает о сообщении и отключает программу. Можно обнаружить и зафиксировать ошибки, которые происходят только на целевом компьютере.

Запишите функциональный getelement, который индексирует в одно поле структуры с помощью значения другого поля структуры.

function y = getelement(S)
y = S.A(S.u);
end

Создайте объект настройки кода для автономной библиотеки или исполняемого файла. Например, создайте объект настройки кода для статической библиотеки. Включите отчет генерации кода.

cfg = coder.config('lib');
cfg.GenerateReport = true;

Включите генерацию обнаружения ошибки времени выполнения и создания отчетов.

cfg.RuntimeChecks = true;

Задайте вход в качестве примера, который можно использовать, чтобы задать свойства входного параметра.

S.A = ones(2,2);
S.u = 0;

Сгенерируйте код.

codegen -config cfg getelement -args {S}

Чтобы открыть отчет генерации кода, щелкните по ссылке View report.

В списке сгенерированных файлов нажмите getelement.c.

Вы видите код, который проверяет на ошибку и вызывает функцию, чтобы сообщить об ошибке. Например, если код обнаруживает за пределы ошибку индексации массива, он вызывает rtDynamicBoundsError, чтобы сообщить об ошибке и отключить программу.

/* Include Files */
#include "rt_nonfinite.h"
#include "getelement.h"
#include "getelement_rtwutil.h"
#include <stdio.h>
#include <stdlib.h>

/* Variable Definitions */
static rtBoundsCheckInfo emlrtBCI = { 1, 4, 2, 5, "S.A", "getelement",
  "C:\\coder\\runtime checks\\getelement.m", 0 };

static rtDoubleCheckInfo emlrtDCI = { 2, 5, "getelement",
  "C:\\coder\\runtime checks\\getelement.m", 1 };

/* Function Definitions */

/*
 * Arguments    : const struct0_T *S
 * Return Type  : double
 */
double getelement(const struct0_T *S)
{
  double d0;
  int i0;
  d0 = S->u;
  if (d0 != (int)floor(d0)) {
    rtIntegerError(d0, &emlrtDCI);
  }

  i0 = (int)d0;
  if (!((i0 >= 1) && (i0 <= 4))) {
    rtDynamicBoundsError(i0, 1, 4, &emlrtBCI);
  }

  return S->A[i0 - 1];
}

Программное обеспечение сообщения об ошибке использует fprintf для сообщений ошибки при записи к stderr. Это использует abort, чтобы отключить приложение. Если fprintf и abort не доступны, необходимо обеспечить их. Функция abort резко отключает программу. Если ваша система поддерживает сигналы, можно отловить сигнал аварийного прекращения работы (SIGABRT) так, чтобы можно было управлять завершением программы.

Похожие темы