Что такое функция "assert"?


Я изучал учебники OpenCV и наткнулся на assert функция; что она делает?

9 228

9 ответов:

assert завершит работу программы (обычно с сообщением, цитирующим оператор assert), если его аргумент окажется ложным. Он обычно используется во время отладки, чтобы сделать сбой программы более очевидным, если возникает неожиданное условие.

например:

assert(length >= 0);  // die if length is negative.

вы также можете добавить более информативное сообщение, которое будет отображаться, если это не так:

assert(length >= 0 && "Whoops, length can't possibly be negative! (didn't we just check 10 lines ago?) Tell jsmith");

или такой:

assert(("Length can't possibly be negative! Tell jsmith", length >= 0));

когда вы делаете релиз (без отладки) сборка, вы также можете удалить накладные расходы на оценку assert операторы, определяя NDEBUG макрос, обычно с переключателем компилятора. Следствием этого является то, что ваша программа должна никогда полагайтесь на выполнение макроса assert.

// BAD
assert(x++);

// GOOD
assert(x);    
x++;

// Watch out! Depends on the function:
assert(foo());

// Here's a safer way:
int ret = foo();
assert(ret);

из комбинации программы, вызывающей abort() и не гарантирующей ничего делать, asserts следует использовать только для тестирования вещей, которые разработчик предположил, а не, например, пользователь вводит a номер, а не буква (которая должна быть обработана другими средствами).

The assert оператор компьютера аналогичен оператору убедится на английском языке.

посмотри

assert () пример программы на C++

многие компиляторы предлагают утверждение() макрос. Макрос assert() возвращает TRUE если значение истинно и принимает какие-то меры, если это оценивает значение FALSE. Многие компиляторы будут прервать программу на assert () что не удается; другие будут выдавать исключение

одна мощная особенность assert() макрос - это препроцессор разрушает его в нет код вообще если Отладка не определена. Это большое помощь во время разработки, и когда конечный продукт поставляется нет производительности и увеличение размер исполняемой версии программа.

например

#include <stdio.h>
#include <assert.h>

void analyze (char *, int);

int main(void)
{
   char *string = "ABC";
   int length = 3;

   analyze(string, length);
   printf("The string %s is not null or empty, "
          "and has length %d \n", string, length);
}

void analyze(char *string, int length)
{
   assert(string != NULL);     /* cannot be NULL */
   assert(*string != '');    /* cannot be empty */
   assert(length > 0);         /* must be positive */
}

/****************  Output should be similar to  ******************
The string ABC is not null or empty, and has length 3

функция assert () может диагностировать ошибки программы. Он определяется в <assert.h>, и его прототип

void assert(int expression);

выражение аргумента может быть все, что вы хотите проверить--переменная или любое выражение C. Если выражение имеет значение TRUE, assert () ничего не делает. Если выражение имеет значение FALSE, assert () отображает сообщение об ошибке на stderr и прерывает выполнение программы.

как вы используете assert ()? он наиболее часто используется для отслеживания программы ошибки (которые отличаются от ошибок компиляции). Ошибка не препятствует компиляции программы, но она приводит к тому, что она дает неправильные результаты или работает неправильно (например, блокировка). Например, программа финансового анализа, которую вы пишете, может иногда давать неправильные ответы. Вы подозреваете, что проблема вызвана тем, что переменная interest_rate принимает отрицательное значение, которое никогда не должно происходить. Чтобы проверить это, поместите заявление

assert(interest_rate >= 0); на места в программе, где используется процентных ставок является. Если переменная когда-либо становится отрицательной, макрос assert() предупреждает вас. Затем можно изучить соответствующий код, чтобы найти причину проблемы.

чтобы увидеть, как assert() работает, запустите пример программы ниже. Если ввести ненулевое значение, программа отобразит его и завершит работу в обычном режиме. При вводе нуля макрос assert () вызывает аварийное завершение программы. Точное сообщение об ошибке вы видите будет зависеть на вашем компиляторе, но вот типичный пример:

ошибка утверждения: x, файл list19_3.c, строка 13 Обратите внимание, что для работы assert() ваша программа должна быть скомпилирована в режиме отладки. Обратитесь к документации компилятора для получения информации о включении режима отладки (как описано в данный момент). При последующей компиляции окончательной версии в режиме выпуска макросы assert () отключаются.

 int x;

 printf("\nEnter an integer value: ");
 scanf("%d", &x);

 assert(x >= 0);

 printf("You entered %d.\n", x);
 return(0);

введите целое число: 10

вы вошли 10.

введите целое число: -1

Сообщение Об Ошибке : Ненормальное завершение программы

сообщение об ошибке может отличаться, в зависимости от вашей системы и компилятора, но общая идея та же.

такие вещи, как "вызывает исключение" и "останавливает выполнение", могут быть верны для большинства компиляторов, но не для всех. (Кстати, есть ли утверждения, которые действительно бросают исключения?)

вот интересное, немного отличающееся значение assert, используемое c6x и другими компиляторами TI: увидев определенные операторы assert, эти компиляторы используют информацию в этом операторе для выполнения определенных оптимизаций. Злобный.

например, в C:

int dot_product(short *x, short *y, short z)
{
  int sum = 0
  int i;

  assert( ( (int)(x) & 0x3 ) == 0 );
  assert( ( (int)(y) & 0x3 ) == 0 );

  for( i = 0 ; i < z ; ++i )
    sum += x[ i ] * y[ i ];
  return sum;
}

Это говорит де компилятор массивы выровнены по 32-битным границам, поэтому компилятор может генерировать конкретные инструкции, сделанные для такого выравнивания.

Assert позволяет остановить выполнение, если условие (утверждение) является ложным.

например (псевдокод):

Bank myBank = Bank.GetMyStuff();

assert(myBank != NULL);

// .. Continue.

Если myBank имеет значение NULL, функция остановит выполнение, и возникнет ошибка. Это очень хорошо для того, чтобы некоторые повторно используемые коды принимали правильные условия и т. д.

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

Он предназначен для использования для проверки предположений, которые вы сделали. Например:

void strcpy(char* dest, char* src){
    //pointers shouldn't be null
    assert(dest!=null);
    assert(src!=null);

    //copy string
    while(*dest++ = *src++);
}

идеал, который вы хотите, заключается в том, что вы можете сделать ошибку в своей программе, например, вызвать функцию с недопустимыми аргументами, и вы нажмете assert перед ней segfaults (или не работает должным образом)

в C++11 N3337 типовой проект

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

19.3 утверждения

1 заголовок , описанный в (Табл. 42), предоставляет макрос для документирования утверждений программы C ++ и механизм отключения проверки утверждений.

2 содержимое совпадает с заголовком стандартной библиотеки C

С99 N1256 типовой проект

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

7.2 Диагностика

1 заголовок <assert.h> определяет макрос assert и ссылается на другой макрос,NDEBUG который не определяется <assert.h>. Если NDEBUG определяется как имя макроса в укажите в исходном файле, где включен, макрос assert определяется как

 #define assert(ignore) ((void)0)

макрос assert переопределяется в соответствии с текущим состоянием NDEBUG каждый раз, когда это <assert.h> включен.

2. Макрос assert должен быть реализован как макрос, а не функция. Если определение макроса подавляется для доступа к фактической функции, поведение не определено.

7.2.1 диагностика программы

7.2.1.1 макрос assert

справка

1.

#include <assert.h>
void assert(scalar expression);

описание

2 Макрос assert помещает диагностические тесты в программы; он расширяется до выражения void. Когда он выполняется, если выражение (которое должно иметь скалярный тип) является ложным (то есть, сравнивается равным 0), макрос assert записывает информацию о конкретном вызове, который ошибка (включая текст аргумента, имя исходного файла, исходную строку номер и название заключительной функции-последние являются соответственно значениями макросы предварительной обработки __FILE__ и __LINE__ и идентификатора __func__) в стандартном потоке ошибок в формате, определяемом реализацией. 165) это затем вызывает функцию abort.

возвращает

3 Макрос assert не возвращает значения.

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

пример кода:

int ** p;
p = new int * [5];      // Dynamic array (size 5) of pointers to int
for (int i = 0; i < 5; ++i) {
    p[i] = new int[3]; // Each i(ptr) is now pointing to a dynamic
                       // array (size 3) of actual int values
}

assert (p);            // Check the dynamic allocation.

аналогично:

if (p == NULL) {
    cout << "dynamic allocation failed" << endl;
    exit(1);
}