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

В этом примере показано, как сгенерировать библиотеки или исполняемые файлы 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 не доступны, вы должны предоставить их. The abort функция внезапно завершает работу программы. Если ваша система поддерживает сигналы, можно поймать сигнал прерывания (SIGABRT), чтобы вы могли контролировать завершение программы.

Похожие темы