NSan: A Floating-Point Numerical Sanitizer

Proceedings of the 30th ACM SIGPLAN International Conference on Compiler Construction, Association for Computing Machinery (2021), 83–93 (to appear)

Abstract

Sanitizers are a relatively recent trend in software engineering. They aim at automatically finding bugs in programs,
and they are now commonly available to programmers as
part of compiler toolchains. For example, the LLVM project
includes out-of-the-box sanitizers to detect thread safety
(tsan), memory (asan,msan,lsan), or undefined behaviour
(ubsan) bugs.
In this article, we present nsan, a new sanitizer for locating
and debugging floating-point numerical issues, implemented
inside the LLVM sanitizer framework. nsan puts emphasis
on practicality. It aims at providing precise, and actionable
feedback, in a timely manner.
nsan uses compile-time instrumentation to augment each
floating-point computation in the program with a higher precision shadow which is checked for consistency during
program execution. This makes nsan between 1 and 4 orders
of magnitude faster than existing approaches, which allows
running it routinely as part of unit tests, or detecting issues
in large production applications.