Incorporate diagnostic tests into your program. The assert()
macro is one convenient mechanism for interactive programs.
...
In the following example, the test for integer wrap has been omitted for the unsigned multiplication based on the assumption that MAX_TABLE_SIZE * sizeof(char *)
cannot exceed SIZE_MAX
. While we know this is true, it cannot do any harm to codify this assumption.
Code Block | ||
---|---|---|
| ||
assert(size <= SIZE_MAX/sizeof(char *));
table_size = size * sizeof(char *);
|
Assertions are primarily intended for use during debugging, and are generally turned off before code is shipped by defining NDEBUG
(typically as a flag passed to the compiler). Consequently, assertions are only useful to protect against incorrect assumptions, and are not intended for runtime error checking.
Examples of improper assertions include:
- invalid user input
- file not found
- out of memory
- invalid permissions
Code that protects against a buffer overflow, for example, cannot be implemented as an assertion because this code must be presented in the deployed executable.
In particular, assertions are generally unsuitable Note that this technique may not be suitable for server programs or embedded systems. A failed assertion could lead to denial of service if a hacker discovered how to trigger it, e.g. if size
were in some way derived from client input. In such situations, a soft failure mode such as writing to a log file is more appropriate.
...