What is the “assert” function?

后端 未结 9 2191
耶瑟儿~
耶瑟儿~ 2020-11-27 09:16

I\'ve been studying OpenCV tutorials and came across the assert function; what does it do?

相关标签:
9条回答
  • 2020-11-27 09:20

    It is a function that will halt program execution if the value it has evaluated is false. Usually it is surrounded by a macro so that it is not compiled into the resultant binary when compiled with release settings.

    It is designed to be used for testing the assumptions you have made. For example:

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

    The ideal you want is that you can make an error in your program, like calling a function with invalid arguments, and you hit an assert before it segfaults (or fails to work as expected)

    0 讨论(0)
  • 2020-11-27 09:23

    Take a look at

    assert() example program in C++

    Many compilers offer an assert() macro. The assert() macro returns TRUE if its parameter evaluates TRUE and takes some kind of action if it evaluates FALSE. Many compilers will abort the program on an assert() that fails; others will throw an exception

    One powerful feature of the assert() macro is that the preprocessor collapses it into no code at all if DEBUG is not defined. It is a great help during development, and when the final product ships there is no performance penalty nor increase in the size of the executable version of the program.

    Eg

    #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 != '\0');    /* 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
    
    0 讨论(0)
  • 2020-11-27 09:25

    C++11 N3337 standard draft

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

    19.3 Assertions

    1 The header <cassert>, described in (Table 42), provides a macro for documenting C ++ program assertions and a mechanism for disabling the assertion checks.

    2 The contents are the same as the Standard C library header <assert.h>.

    C99 N1256 standard draft

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

    7.2 Diagnostics <assert.h>

    1 The header <assert.h> defines the assert macro and refers to another macro, NDEBUG which is not defined by <assert.h>. If NDEBUG is defined as a macro name at the point in the source file where <assert.h> is included, the assert macro is defined simply as

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

    The assert macro is redefined according to the current state of NDEBUG each time that <assert.h> is included.

    2. The assert macro shall be implemented as a macro, not as an actual function. If the macro definition is suppressed in order to access an actual function, the behavior is undefined.

    7.2.1 Program diagnostics

    7.2.1.1 The assert macro

    Synopsis

    1.

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

    Description

    2 The assert macro puts diagnostic tests into programs; it expands to a void expression. When it is executed, if expression (which shall have a scalar type) is false (that is, compares equal to 0), the assert macro writes information about the particular call that failed (including the text of the argument, the name of the source file, the source line number, and the name of the enclosing function — the latter are respectively the values of the preprocessing macros __FILE__ and __LINE__ and of the identifier __func__) on the standard error stream in an implementation-defined format. 165) It then calls the abort function.

    Returns

    3 The assert macro returns no value.

    0 讨论(0)
  • 2020-11-27 09:27

    Stuff like 'raises exception' and 'halts execution' might be true for most compilers, but not for all. (BTW, are there assert statements that really throw exceptions?)

    Here's an interesting, slightly different meaning of assert used by c6x and other TI compilers: upon seeing certain assert statements, these compilers use the information in that statement to perform certain optimizations. Wicked.

    Example in 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;
    }
    

    This tells de compiler the arrays are aligned on 32-bits boundaries, so the compiler can generate specific instructions made for that kind of alignment.

    0 讨论(0)
  • 2020-11-27 09:36

    The assert computer statement is analogous to the statement make sure in English.

    0 讨论(0)
  • 2020-11-27 09:38

    In addition, you can use it to check if the dynamic allocation was successful.

    Code example:

    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.
    

    Similar to:

    if (p == NULL) {
        cout << "dynamic allocation failed" << endl;
        exit(1);
    }
    
    0 讨论(0)
提交回复
热议问题