bugfix: Kill compile processes that generates too much output by cmaglie · Pull Request #2883 · arduino/arduino-cli (original) (raw)

Previously, compiling a sketch containing an include loop could generate a lot of output and crash the Arduino CLI with an out-of-memory error. This is due to the library-discovery process that buffers the stderr output of the compiler for analysis after the process exits.

To fix this problem, a limit to the compiler output has been set to 100KB of data.

$ cat sketch.ino
#include <a.h>
$ cat a.h
#include <a.h>
#include <a.h>
#include <a.h>
$ arduino-cli compile -b arduino:avr:uno

The process never terminates, and it's killed for OOM later by the kernel.

$ cat sketch.ino
#include <a.h>
$ cat a.h
#include <a.h>
#include <a.h>
#include <a.h>
$ arduino-cli compile -b arduino:avr:uno
[...a lot of output truncated...]
In file included from /home/cmaglie/sketch/a.h:1:0,
                 from /home/cmaglie/sketch/a.h:2,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:2,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/a.h:1,
                 from /home/cmaglie/sketch/sketch.ino:1:
/home/cmaglie/sketch/a.h:1:15: error: #include nested too deeply
/home/cmaglie/sketch/a.h:2:15: error: #include nested too deeply
Compiler error output has been truncated.

Used platform Version Path
arduino:avr   1.6.22  /home/cmaglie/.arduino15/packages/arduino/hardware/avr/1.6.22
Error during build: signal: killed
$

A legitimate sketch may produce a lot of warnings from a single file, going over 100KB. In that extreme case, the sketch could not be compiled anymore with Arduino CLI.

100KB looks like a reasonable limit. By the way, there are no specific stats available about this, so we have to deploy this fix, get feedback from the user, and be ready to increase this limit if needed.