Coverage Report

Created: 2026-08-14 06:37

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/postgres/src/backend/utils/error/assert.c
Line
Count
Source
1
/*-------------------------------------------------------------------------
2
 *
3
 * assert.c
4
 *    Assert support code.
5
 *
6
 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7
 * Portions Copyright (c) 1994, Regents of the University of California
8
 *
9
 *
10
 * IDENTIFICATION
11
 *    src/backend/utils/error/assert.c
12
 *
13
 *-------------------------------------------------------------------------
14
 */
15
#include "postgres.h"
16
17
#include <unistd.h>
18
#ifdef HAVE_EXECINFO_H
19
#include <execinfo.h>
20
#endif
21
22
/*
23
 * ExceptionalCondition - Handles the failure of an Assert()
24
 *
25
 * We intentionally do not go through elog() here, on the grounds of
26
 * wanting to minimize the amount of infrastructure that has to be
27
 * working to report an assertion failure.
28
 */
29
void
30
ExceptionalCondition(const char *conditionName,
31
           const char *fileName,
32
           int lineNumber)
33
0
{
34
  /* Report the failure on stderr (or local equivalent) */
35
0
  if (!conditionName || !fileName)
36
0
    write_stderr("TRAP: ExceptionalCondition: bad arguments in PID %d\n",
37
0
           (int) getpid());
38
0
  else
39
0
    write_stderr("TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n",
40
0
           conditionName, fileName, lineNumber, (int) getpid());
41
42
  /* Usually this shouldn't be needed, but make sure the msg went out */
43
0
  fflush(stderr);
44
45
  /* If we have support for it, dump a simple backtrace */
46
0
#ifdef HAVE_BACKTRACE_SYMBOLS
47
0
  {
48
0
    void     *buf[100];
49
0
    int     nframes;
50
51
0
    nframes = backtrace(buf, lengthof(buf));
52
0
    backtrace_symbols_fd(buf, nframes, fileno(stderr));
53
0
  }
54
0
#endif
55
56
  /*
57
   * If configured to do so, sleep indefinitely to allow user to attach a
58
   * debugger.  It would be nice to use pg_usleep() here, but that can sleep
59
   * at most 2G usec or ~33 minutes, which seems too short.
60
   */
61
#ifdef SLEEP_ON_ASSERT
62
  sleep(1000000);
63
#endif
64
65
0
  abort();
66
0
}