Skip to content

Large stack usage in core and MDNS libraries #7398

Open
@earlephilhower

Description

@earlephilhower

I've been playing locally with GCC10 and the -Wstack-usage= option which emits a compile-time warning when stacks are larger than the size given. There's only 4K total stack to play with so I set the warning limit to 300 bytes.

This isn't an exhaustive list (need to do a local CI and aggregate warnings), but I'm seeing very high use in the flash_hal and MDNS:

Flash_write() has a 512 byte buffer allocated on the stack in the case of an unaligned write, which seems pretty massive and ripe for reduction:

C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\cores\esp8266\flash_hal.cpp: In function 'int32_t flash_hal_write(uint32_t, uint32_t, const uint8_t*)':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\cores\esp8266\flash_hal.cpp:102:9: warning: stack usage is 576 bytes [-Wstack-usage=]
  102 | int32_t flash_hal_write(uint32_t addr, uint32_t size, const uint8_t *src) {
      |         ^~~~~~~~~~~~~~~

MDNS (old and new) have stack usages up to almost 700 bytes which might explain some issues seen at runtime.

C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Control.cpp: In member function 'uint8_t esp8266::MDNSImplementation::MDNSResponder::_ZNK7esp826618MDNSImplementation13MDNSResponder17_replyMaskForHostERKNS1_16stcMDNS_RRHeaderEPb$part$0(const esp8266::MDNSImplementation::MDNSResponder::stcMDNS_RRHeader&, bool*) const':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Control.cpp:1991:9: warning: stack usage is 304 bytes [-Wstack-usage=]
 1991 | uint8_t MDNSResponder::_replyMaskForHost(const MDNSResponder::stcMDNS_RRHeader& p_RRHeader,
      |         ^~~~~~~~~~~~~
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Control.cpp: In member function 'uint8_t esp8266::MDNSImplementation::MDNSResponder::_ZNK7esp826618MDNSImplementation13MDNSResponder20_replyMaskForServiceERKNS1_16stcMDNS_RRHeaderERKNS1_14stcMDNSServiceEPb$part$0(const esp8266::MDNSImplementation::MDNSResponder::stcMDNS_RRHeader&, const esp8266::MDNSImplementation::MDNSResponder::stcMDNSService&, bool*) const':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Control.cpp:2069:9: warning: stack usage is 576 bytes [-Wstack-usage=]
 2069 | uint8_t MDNSResponder::_replyMaskForService(const MDNSResponder::stcMDNS_RRHeader& p_RRHeader,
      |         ^~~~~~~~~~~~~
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Control.cpp: In member function 'bool esp8266::MDNSImplementation::MDNSResponder::_parseQuery(const esp8266::MDNSImplementation::MDNSResponder::stcMDNS_MsgHeader&)':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Control.cpp:179:6: warning: stack usage is 608 bytes [-Wstack-usage=]
  179 | bool MDNSResponder::_parseQuery(const MDNSResponder::stcMDNS_MsgHeader& p_MsgHeader)
      |      ^~~~~~~~~~~~~
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Control.cpp: In member function 'bool esp8266::MDNSImplementation::MDNSResponder::_ZN7esp826618MDNSImplementation13MDNSResponder15_processAnswersEPKNS1_16stcMDNS_RRAnswerE$part$0(const esp8266::MDNSImplementation::MDNSResponder::stcMDNS_RRAnswer*)':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Control.cpp:749:6: warning: stack usage is 320 bytes [-Wstack-usage=]
  749 | bool MDNSResponder::_processAnswers(const MDNSResponder::stcMDNS_RRAnswer* p_pAnswers)
      |      ^~~~~~~~~~~~~
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Control.cpp: In member function 'bool esp8266::MDNSImplementation::MDNSResponder::_parseResponse(const esp8266::MDNSImplementation::MDNSResponder::stcMDNS_MsgHeader&)':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Control.cpp:628:6: warning: stack usage is 320 bytes [-Wstack-usage=]
  628 | bool MDNSResponder::_parseResponse(const MDNSResponder::stcMDNS_MsgHeader& p_MsgHeader)
      |      ^~~~~~~~~~~~~
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\ESP8266mDNS_Legacy.cpp: In member function 'void Legacy_MDNSResponder::MDNSResponder::_parsePacket()':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\ESP8266mDNS_Legacy.cpp:567:6: warning: stack usage is 688 bytes [-Wstack-usage=]
  567 | void MDNSResponder::_parsePacket()
      |      ^~~~~~~~~~~~~
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Transfer.cpp: In member function 'bool esp8266::MDNSImplementation::MDNSResponder::_writeMDNSHostDomain(const char*, bool, esp8266::MDNSImplementation::MDNSResponder::stcMDNSSendParameter&)':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Transfer.cpp:1367:6: warning: stack usage is 320 bytes [-Wstack-usage=]
 1367 | bool MDNSResponder::_writeMDNSHostDomain(const char* p_pcHostname,
      |      ^~~~~~~~~~~~~
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Transfer.cpp: In member function 'bool esp8266::MDNSImplementation::MDNSResponder::_writeMDNSServiceDomain(const esp8266::MDNSImplementation::MDNSResponder::stcMDNSService&, bool, bool, esp8266::MDNSImplementation::MDNSResponder::stcMDNSSendParameter&)':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Transfer.cpp:1410:6: warning: stack usage is 320 bytes [-Wstack-usage=]
 1410 | bool MDNSResponder::_writeMDNSServiceDomain(const MDNSResponder::stcMDNSService& p_Service,
      |      ^~~~~~~~~~~~~
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Transfer.cpp: In member function 'bool esp8266::MDNSImplementation::MDNSResponder::_writeMDNSAnswer_PTR_IP4(IPAddress, esp8266::MDNSImplementation::MDNSResponder::stcMDNSSendParameter&)':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Transfer.cpp:1517:6: warning: stack usage is 560 bytes [-Wstack-usage=]
 1517 | bool MDNSResponder::_writeMDNSAnswer_PTR_IP4(IPAddress p_IPAddress,
      |      ^~~~~~~~~~~~~
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Transfer.cpp: In member function 'bool esp8266::MDNSImplementation::MDNSResponder::_writeMDNSAnswer_PTR_TYPE(esp8266::MDNSImplementation::MDNSResponder::stcMDNSService&, esp8266::MDNSImplementation::MDNSResponder::stcMDNSSendParameter&)':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Transfer.cpp:1550:6: warning: stack usage is 544 bytes [-Wstack-usage=]
 1550 | bool MDNSResponder::_writeMDNSAnswer_PTR_TYPE(MDNSResponder::stcMDNSService& p_rService,
      |      ^~~~~~~~~~~~~
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Transfer.cpp: In member function 'bool esp8266::MDNSImplementation::MDNSResponder::_writeMDNSAnswer_SRV(esp8266::MDNSImplementation::MDNSResponder::stcMDNSService&, esp8266::MDNSImplementation::MDNSResponder::stcMDNSSendParameter&)':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\libraries\ESP8266mDNS\src\LEAmDNS_Transfer.cpp:1725:6: warning: stack usage is 320 bytes [-Wstack-usage=]
 1725 | bool MDNSResponder::_writeMDNSAnswer_SRV(MDNSResponder::stcMDNSService& p_rService,
      |      ^~~~~~~~~~~~~

Crypto.c has some large stacks (which might be unavoidable given the algorithm, but we may want to consider moving it to heap or refactoring the code:

C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\cores\esp8266\Crypto.cpp: In function 'void* {anonymous}::createBearsslHmac(const br_hash_class*, const void*, size_t, const void*, size_t, void*, size_t)':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\cores\esp8266\Crypto.cpp:67:7: warning: stack usage is 432 bytes [-Wstack-usage=]
   67 | void *createBearsslHmac(const br_hash_class *hashType, const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
      |       ^~~~~~~~~~~~~~~~~
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\cores\esp8266\Crypto.cpp: In function 'void* {anonymous}::createBearsslHmacCT(const br_hash_class*, const void*, size_t, const void*, size_t, void*, size_t)':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\cores\esp8266\Crypto.cpp:110:7: warning: stack usage is 464 bytes [-Wstack-usage=]
  110 | void *createBearsslHmacCT(const br_hash_class *hashType, const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
      |       ^~~~~~~~~~~~~~~~~~~
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\cores\esp8266\Crypto.cpp: In function 'void experimental::crypto::chacha20Poly1305Kernel(int, void*, size_t, const void*, const void*, size_t, const void*, void*, const void*, size_t)':
C:\Users\earle\Documents\Arduino\hardware\esp8266com\esp8266\cores\esp8266\Crypto.cpp:507:6: warning: stack usage is 464 bytes [-Wstack-usage=]
  507 | void chacha20Poly1305Kernel(const int encrypt, void *data, const size_t dataLength, const void *key, const void *keySalt, const size_t keySaltLength,
      |      ^~~~~~~~~~~~~~~~~~~~~~

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions