mirror of
https://github.com/openshwprojects/OpenBK7231T_App.git
synced 2026-02-05 05:55:52 +00:00
Ability to run linux tests with AddressSanitizer (#1651)
* Ability to run linux tests with AddressSanitizer
This makes it possible to compile and run the tests with Address
Sanitizer (ASAN) [1].
The command is:
```
make -f custom.mk clean; ASAN=1 make -f custom.mk && ./build/win_main -runUnitTests 2
```
Building without ASAN works without change.
Address Sanitizer saves a lot of time debugging memory issues, for
example for a bug where we index in an array with negative index it
gives this nice error message:
```
=================================================================
==2532658==ERROR: AddressSanitizer: global-buffer-overflow on address 0x5642389c5e37 at pc 0x564237e67492 bp 0x7fff17726e50 sp 0x7fff17726e40
READ of size 1 at 0x5642389c5e37 thread T0
#0 0x564237e67491 in CHANNEL_GetType src/new_cfg.c:427
#1 0x564237dfc933 in TuyaMCU_ApplyMapping src/driver/drv_tuyaMCU.c:1126
#2 0x564237dff92f in TuyaMCU_ParseStateMessage src/driver/drv_tuyaMCU.c:1632
#3 0x564237e019fa in TuyaMCU_ProcessIncoming src/driver/drv_tuyaMCU.c:1977
#4 0x564237e027ee in TuyaMCU_RunReceive src/driver/drv_tuyaMCU.c:2178
#5 0x564237e02dc2 in TuyaMCU_RunFrame src/driver/drv_tuyaMCU.c:2335
#6 0x564237dd2ce6 in DRV_RunQuickTick src/driver/drv_main.c:536
#7 0x564237ec4037 in QuickTick src/user_main.c:946
#8 0x564237eca8a5 in Sim_RunFrame src/win_main.c:106
#9 0x564237eca993 in Sim_RunFrames src/win_main.c:134
#10 0x564237ebce4a in Test_TuyaMCU_Basic src/selftest/selftest_tuyaMCU.c:369
#11 0x564237ecab1f in Win_DoUnitTests src/win_main.c:194
#12 0x564237ecba57 in main src/win_main.c:535
#13 0x7fb55312ed8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
#14 0x7fb55312ee3f in __libc_start_main_impl ../csu/libc-start.c:392
#15 0x564237cb16b4 in _start (/home/niteria/tmp/broken-realloc/OpenBK7231T_App/build/win_main+0xcf6b4)
0x5642389c5e37 is located 51 bytes to the right of global variable 'stat_deduper_culled_tooFast' defined in 'src/mqtt/new_mqtt_deduper.c:40:12' (0x5642389c5e00) of size 4
0x5642389c5e37 is located 9 bytes to the left of global variable 'g_mutex' defined in 'src/mqtt/new_mqtt_deduper.c:42:26' (0x5642389c5e40) of size 4
SUMMARY: AddressSanitizer: global-buffer-overflow src/new_cfg.c:427 in CHANNEL_GetType
Shadow bytes around the buggy address:
0x0ac8c7130b70: 04 f9 f9 f9 f9 f9 f9 f9 04 f9 f9 f9 f9 f9 f9 f9
0x0ac8c7130b80: 00 f9 f9 f9 f9 f9 f9 f9 04 f9 f9 f9 f9 f9 f9 f9
0x0ac8c7130b90: 04 f9 f9 f9 f9 f9 f9 f9 04 f9 f9 f9 f9 f9 f9 f9
0x0ac8c7130ba0: 00 00 00 00 00 00 00 00 00 00 f9 f9 f9 f9 f9 f9
0x0ac8c7130bb0: 04 f9 f9 f9 f9 f9 f9 f9 04 f9 f9 f9 f9 f9 f9 f9
=>0x0ac8c7130bc0: 04 f9 f9 f9 f9 f9[f9]f9 04 f9 f9 f9 f9 f9 f9 f9
0x0ac8c7130bd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0ac8c7130be0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0ac8c7130bf0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0ac8c7130c00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0ac8c7130c10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
Shadow gap: cc
==2532658==ABORTING
```
[1] https://github.com/google/sanitizers/wiki/addresssanitizer
* disable tests broken on linux
* add a suppression file for known leaks
* attempt at adding an ASAN workflow
* fix autogen
* Update workflow.yaml
---------
Co-authored-by: openshwprojects <85486843+openshwprojects@users.noreply.github.com>
This commit is contained in:
20
.github/workflows/workflow.yaml
vendored
20
.github/workflows/workflow.yaml
vendored
@ -103,6 +103,26 @@ jobs:
|
||||
name: ${{ env.APP_NAME }}_${{ needs.refs.outputs.version }}_sim
|
||||
path: output/${{ needs.refs.outputs.version }}/obkSimulator_${{ needs.refs.outputs.version }}.zip
|
||||
|
||||
build_asan:
|
||||
name: Build Linux Simulator and Run Tests With Address Sanitizer
|
||||
needs: refs
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Checkout berry submodule
|
||||
run: |
|
||||
git submodule update --init --recursive libraries/berry
|
||||
|
||||
- name: Build project
|
||||
run: ASAN=1 make -f custom.mk
|
||||
- name: Run unit tests
|
||||
run: |
|
||||
export LSAN_OPTIONS=suppressions=platforms/linux/asan.suppressions
|
||||
./build/win_main -runUnitTests 2
|
||||
|
||||
build:
|
||||
name: Build
|
||||
needs: refs
|
||||
|
||||
10
custom.mk
10
custom.mk
@ -22,7 +22,7 @@ BERRY_SRCPATH = libraries/berry/src/
|
||||
# are built, so it needs the translation function from a C source to an object
|
||||
# file
|
||||
define obj_from_c
|
||||
$(patsubst %.c, %.o, $(1))
|
||||
$(patsubst %.c, build/%.c.o, $(1))
|
||||
endef
|
||||
|
||||
include libraries/berry.mk
|
||||
@ -41,6 +41,14 @@ CPPFLAGS ?= $(INCLUDES) -MMD -MP -std=gnu99 -DWINDOWS -DLINUX
|
||||
|
||||
|
||||
CFLAGS ?= -std=gnu99 -W -Wall -Wextra -g
|
||||
LDFLAGS ?=
|
||||
|
||||
# Append ASAN flags if ASAN=1
|
||||
ifeq ($(ASAN),1)
|
||||
CPPFLAGS += -g -fsanitize=address -fno-omit-frame-pointer
|
||||
CFLAGS += -g -fsanitize=address -fno-omit-frame-pointer
|
||||
LDFLAGS += -g -static-libasan -fsanitize=address
|
||||
endif
|
||||
|
||||
$(BUILD_DIR)/$(TARGET_EXEC): $(OBJS)
|
||||
@echo "Linking: $@"
|
||||
|
||||
4
platforms/linux/asan.suppressions
Normal file
4
platforms/linux/asan.suppressions
Normal file
@ -0,0 +1,4 @@
|
||||
leak:CMD_CreateAliasHelper
|
||||
leak:SPILED_InitDMA
|
||||
leak:Test_HassDiscovery
|
||||
leak:TuyaMCU_RunFrame
|
||||
@ -356,7 +356,10 @@ void Test_EnergyMeter_TurnOffScript() {
|
||||
}
|
||||
void Test_EnergyMeter() {
|
||||
Test_EnergyMeter_CSE7766();
|
||||
#ifndef LINUX
|
||||
// TODO: fix on Linux
|
||||
Test_EnergyMeter_BL0942();
|
||||
#endif
|
||||
Test_EnergyMeter_Basic();
|
||||
Test_EnergyMeter_Tasmota();
|
||||
Test_EnergyMeter_Events();
|
||||
|
||||
@ -225,7 +225,10 @@ void Win_DoUnitTests() {
|
||||
Test_Demo_ExclusiveRelays();
|
||||
Test_MultiplePinsOnChannel();
|
||||
Test_Flags();
|
||||
#ifndef LINUX
|
||||
// TODO: fix on Linux
|
||||
Test_DHT();
|
||||
#endif
|
||||
Test_Tasmota();
|
||||
Test_NTP();
|
||||
Test_NTP_DST();
|
||||
|
||||
Reference in New Issue
Block a user