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

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

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


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


посмотри

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

многие компиляторы предлагают assert() макрос. Макрос 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;
}

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


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

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

Bank myBank = Bank.GetMyStuff();

assert(myBank != NULL);

// .. Continue.

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


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

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

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. Когда он выполняется, если выражение (которое должно иметь скалярный тип) имеет значение false (то есть, сравнивает равным 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);
}