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.
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
$
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.
Please check if the PR fulfills these requirements
See how to contribute
before creating one)
our contributing guidelines
UPGRADING.md
has been updated with a migration guide (for breaking changes)configuration.schema.json
updated if new parameters are added.What kind of change does this PR introduce?
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.
What is the current behavior?
The process never terminates, and it's killed for OOM later by the kernel.
What is the new behavior?
Does this PR introduce a breaking change, and is titled accordingly?
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.
Other information