---
name: "assert"
section: "3"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/assert"
---

# assert(3)

abort the program if assertion is false

## NAME

assert - abort the program if assertion is false

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <assert.h>
```

**void assert(bool** *expression***);**

## DESCRIPTION

This macro can help programmers find bugs in their programs, or handle exceptional cases via a crash that will produce limited debugging output.

If *expression* is false (i.e., compares equal to zero), **assert**() prints an error message to standard error and terminates the program by calling [**abort**(3)](/abort/3.md). The error message includes the name of the file and function containing the **assert**() call, the source code line number of the call, and the text of the argument; something like:

```
prog: some_file.c:16: some_func: Assertion `val == 0' failed.
```

If the macro **NDEBUG** is defined at the moment *\<assert.h\>* was last included, the macro **assert**() generates no code, and hence does nothing at all. It is not recommended to define **NDEBUG** if using **assert**() to detect error conditions since the software may behave non-deterministically.

## RETURN VALUE

No value is returned.

## ATTRIBUTES

For an explanation of the terms used in this section, see [**attributes**(7)](/attributes/7.md).

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **assert**() | Thread safety | MT-Safe |

## STANDARDS

C11, POSIX.1-2008.

## HISTORY

C89, C99, POSIX.1-2001.

In C89, *expression* is required to be of type *int* and undefined behavior results if it is not, but in C99 it may have any scalar type.

## BUGS

**assert**() is implemented as a macro; if the expression tested has side-effects, program behavior will be different depending on whether **NDEBUG** is defined. This may create Heisenbugs which go away when debugging is turned on.

## SEE ALSO

[**abort**(3)](/abort/3.md), [**assert\_perror**(3)](/assert_perror/3.md), [**exit**(3)](/exit/3.md)
