exponenta event banner

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

В этом примере показано, как создавать библиотеки 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}

Чтобы открыть отчет о создании кода, щелкните ссылку Просмотр отчета.

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

Связанные темы