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.