Open
Description
Describe the problem
Compiler warnings for code from non-.ino
source files are not shown on subsequent sketch compilations.
To reproduce
When someone writes code like this (see below) he will correctly get two identical warnings:
warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
When one compiles it again the warnings will all disappear so the user (me) thinks he is perfectly fine and writing clean code.
FunFact: This will not happen if all code is written to the main (.ino) file.
File DummyClass.h
:
class DummyClass
{
public:
char* getString();
char* getSecondString();
};
File DummyClass.cpp
:
char* DummyClass::getString()
{
return "Some String";
}
char* DummyClass::getSecondString()
{
return "Some other string";
}
File test.ino
:
#include "DummyClass.h"
DummyClass dummy;
void setup()
{
Serial.begin(115200);
}
void loop()
{
Serial.println(dummy.getString());
delay(1000);
}
Expected behavior
Compiler warnings are shown every time the sketch is compiled if the code would produce a warning.
Arduino CLI version
Operating system
All
Operating system version
Any
Additional context
Additional reports
- https://forum.arduino.cc/t/arduino-ide-2-0-3-duplicate-tab-page/1084561/5
- https://forum.arduino.cc/t/warning-disappears-after-second-compilation/1139615
- https://forum.arduino.cc/t/bad-behaviour-using-keypad/1231737/9
- https://forum.arduino.cc/t/feature-request-clean-build-option/1291789/9
Related
Issue checklist
- I searched for previous reports in the issue trackerI verified the problem still occurs when using the nightly buildMy report contains all necessary details
Activity
matthijskooijman commentedon Oct 17, 2016
This is caused by caching: the second time the file is not recompiled if it was unchanged, so the warnings are not shown. The only way I can see to fix this (other than making warnings into errors), is to cache the stdout/stderr output as well, so it can be shown again even when not running the compiler. Not sure if this is the best way to approach this, though.
facchinm commentedon Oct 20, 2016
@matthijskooijman is correct, caching elides warnings from previous compilations. I believe that
ccache
caches stdout/stderr and replays them even if the cached version is unchanged, so the approach could be ok, we only need to find a suitable "backend" for storing this information (taking care it also works in a cloud infrastructure)per1234 commentedon Jun 19, 2021
There is some valuable related discussion here: arduino/arduino-builder#301
Matthijs was kind enough to add a link to here on that end, but it seems the backtrack reference generated by GitHub was lost when I transferred this issue from the arduino/Arduino repo.
3 remaining items