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

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

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

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

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

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

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

cfg.RuntimeChecks = true;

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

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

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

codegen -config cfg getelement -args {S}

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

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

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

/* Include files */
#include "getelement.h"
#include "getelement_rtwutil.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

/* Variable Definitions */
static rtBoundsCheckInfo emlrtBCI = { 1,/* iFirst */
  4,                                   /* iLast */
  2,                                   /* lineNo */
  5,                                   /* colNo */
  "S.A",                               /* aName */
  "getelement",                        /* fName */
  "C:\\Users\\username\\Documents\\MATLAB\\runtime-error-ex\\getelement.m",/* pName */
  0                                    /* checkKind */
};

static rtDoubleCheckInfo emlrtDCI = { 2,/* lineNo */
  5,                                   /* colNo */
  "getelement",                        /* fName */
  "C:\\Users\\username\\Documents\\MATLAB\\runtime-error-ex\\getelement.m",/* pName */
  1                                    /* checkKind */
};

/* Function Definitions */
double getelement(const struct0_T *S)
{
  int i;
  if (S->u != (int)floor(S->u)) {
    rtIntegerError(S->u, &emlrtDCI);
  }

  i = (int)S->u;
  if ((i < 1) || (i > 4)) {
    rtDynamicBoundsError(i, 1, 4, &emlrtBCI);
  }

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

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

Похожие темы