When building and running the demo binary with AddressSanitizer/LeakSanitizer enabled, tests2j reports a memory leak in demo/my_struct_2_json.c::s2j_test2().
Then excute the binary...
➜ demo git:(master) ✗ ls
error_print.txt main.c struct_defination.json
generate_s2j_code.py my_struct_2_json.c struct_defination.txt
generate_struct_defination.py my_struct_2_json.h tests2j
inc my_struct_2_json.inc
➜ demo git:(master) ✗ ./tests2j
Converted OK!
s2j:
McUsrInfoT: {
"pInt": 0,
"pIntArray": [0, 0],
"fun": 0,
"funArray": [0, 0],
"day1": 0,
"day2": 0,
"day2Array": [0, 0],
"id": 0,
"idArray": [0, 0],
"usrType": 0,
"usrName": "",
"usrNameArray": ["", ""],
"usrSqno": 0,
"ussSqnoArray": [0, 0],
"jobSqno": 0,
"jobSqnoArray": [0, 0],
"rate": 0,
"rateArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}
McUsrInfoT:json_cmp1:1
s2j2s2j:
McUsrInfoT: {
"pInt": 0,
"pIntArray": [0, 0],
"fun": 0,
"funArray": [0, 0],
"day1": 0,
"day2": 0,
"day2Array": [0, 0],
"id": 0,
"idArray": [0, 0],
"usrType": 0,
"usrName": "",
"usrNameArray": ["", ""],
"usrSqno": 0,
"ussSqnoArray": [0, 0],
"jobSqno": 0,
"jobSqnoArray": [0, 0],
"rate": 0,
"rateArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}
McUsrInfoT:strcmp:0
McUsrInfoT:json_cmp2:1
s2j:
McBaseOrdrT: {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}
McBaseOrdrT:json_cmp1:1
s2j2s2j:
McBaseOrdrT: {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}
McBaseOrdrT:strcmp:0
McBaseOrdrT:json_cmp2:1
s2j:
McBaseOrdrArrayT: {
"mcBaseOrdrArray": [{
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}, {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}]
}
McBaseOrdrArrayT:json_cmp1:1
s2j2s2j:
McBaseOrdrArrayT: {
"mcBaseOrdrArray": [{
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}, {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}]
}
McBaseOrdrArrayT:strcmp:0
McBaseOrdrArrayT:json_cmp2:1
s2j:
McOcoBaseOrdrT: {
"mcBaseOrdrAry": {
"mcBaseOrdrArray": [{
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}, {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}]
},
"pUsrDef": 0
}
McOcoBaseOrdrT:json_cmp1:1
s2j2s2j:
McOcoBaseOrdrT: {
"mcBaseOrdrAry": {
"mcBaseOrdrArray": [{
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}, {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}]
},
"pUsrDef": 0
}
McOcoBaseOrdrT:strcmp:0
McOcoBaseOrdrT:json_cmp2:1
struct_defination.json:
{
"struct": [
{
"type": "void*",
"value": null
},
{
"type": "McUsrInfoT",
"value": {
"pInt": 0,
"pIntArray": [0, 0],
"fun": 0,
"funArray": [0, 0],
"day1": 0,
"day2": 0,
"day2Array": [0, 0],
"id": 0,
"idArray": [0, 0],
"usrType": 0,
"usrName": "",
"usrNameArray": ["", ""],
"usrSqno": 0,
"ussSqnoArray": [0, 0],
"jobSqno": 0,
"jobSqnoArray": [0, 0],
"rate": 0,
"rateArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}
},
{
"type": "McBaseOrdrT",
"value": {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}
},
{
"type": "McBaseOrdrArrayT",
"value": {
"mcBaseOrdrArray": [{
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}, {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}]
}
},
{
"type": "McOcoBaseOrdrT",
"value": {
"mcBaseOrdrAry": {
"mcBaseOrdrArray": [{
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}, {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}]
},
"pUsrDef": 0
}
}
]
}
size:
5
type:McUsrInfoT:
j2str:
McUsrInfoT: {
"pInt": 0,
"pIntArray": [0, 0],
"fun": 0,
"funArray": [0, 0],
"day1": 0,
"day2": 0,
"day2Array": [0, 0],
"id": 0,
"idArray": [0, 0],
"usrType": 0,
"usrName": "",
"usrNameArray": ["", ""],
"usrSqno": 0,
"ussSqnoArray": [0, 0],
"jobSqno": 0,
"jobSqnoArray": [0, 0],
"rate": 0,
"rateArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}
j2s2j:
McUsrInfoT: {
"pInt": 0,
"pIntArray": [0, 0],
"fun": 0,
"funArray": [0, 0],
"day1": 0,
"day2": 0,
"day2Array": [0, 0],
"id": 0,
"idArray": [0, 0],
"usrType": 0,
"usrName": "",
"usrNameArray": ["", ""],
"usrSqno": 0,
"ussSqnoArray": [0, 0],
"jobSqno": 0,
"jobSqnoArray": [0, 0],
"rate": 0,
"rateArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}
McUsrInfoT:strcmp:0
McUsrInfoT:json_cmp:1
type:McBaseOrdrT:
j2str:
McBaseOrdrT: {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}
j2s2j:
McBaseOrdrT: {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}
McBaseOrdrT:strcmp:0
McBaseOrdrT:json_cmp:1
type:McBaseOrdrArrayT:
j2str:
McBaseOrdrArrayT: {
"mcBaseOrdrArray": [{
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}, {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}]
}
j2s2j:
McBaseOrdrArrayT: {
"mcBaseOrdrArray": [{
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}, {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}]
}
McBaseOrdrArrayT:strcmp:0
McBaseOrdrArrayT:json_cmp:1
type:McOcoBaseOrdrT:
j2str:
McOcoBaseOrdrT: {
"mcBaseOrdrAry": {
"mcBaseOrdrArray": [{
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}, {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}]
},
"pUsrDef": 0
}
j2s2j:
McOcoBaseOrdrT: {
"mcBaseOrdrAry": {
"mcBaseOrdrArray": [{
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}, {
"taskSqno": 0,
"taskSqnoArray": [0, 0],
"price": 0,
"priceArray": [0, 0]
}]
},
"pUsrDef": 0
}
McOcoBaseOrdrT:strcmp:0
McOcoBaseOrdrT:json_cmp:1
=================================================================
==2820886==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 64 byte(s) in 1 object(s) allocated from:
#0 0x5b32d9f0418e in malloc (/home/cyd/fuzz_target/struct2json/demo/tests2j+0xdc18e) (BuildId: 58a8635ba9bb2828)
#1 0x5b32d9f44aea in cJSON_New_Item /home/cyd/fuzz_target/struct2json/demo/../cJSON/cJSON.c:254:27
#2 0x5b32d9f44aea in cJSON_ParseWithLengthOpts /home/cyd/fuzz_target/struct2json/demo/../cJSON/cJSON.c:1142:12
#3 0x5b32d9f4b117 in cJSON_ParseWithOpts /home/cyd/fuzz_target/struct2json/demo/../cJSON/cJSON.c:1119:12
#4 0x5b32d9f4b117 in cJSON_Parse /home/cyd/fuzz_target/struct2json/demo/../cJSON/cJSON.c:1205:12
#5 0x5b32d9f5524a in main /home/cyd/fuzz_target/struct2json/demo/./main.c:134:5
Indirect leak of 448 byte(s) in 7 object(s) allocated from:
#0 0x5b32d9f0418e in malloc (/home/cyd/fuzz_target/struct2json/demo/tests2j+0xdc18e) (BuildId: 58a8635ba9bb2828)
#1 0x5b32d9f49869 in cJSON_New_Item /home/cyd/fuzz_target/struct2json/demo/../cJSON/cJSON.c:254:27
#2 0x5b32d9f49869 in parse_object /home/cyd/fuzz_target/struct2json/demo/../cJSON/cJSON.c:1666:27
Indirect leak of 320 byte(s) in 5 object(s) allocated from:
#0 0x5b32d9f0418e in malloc (/home/cyd/fuzz_target/struct2json/demo/tests2j+0xdc18e) (BuildId: 58a8635ba9bb2828)
#1 0x5b32d9f46f27 in cJSON_New_Item /home/cyd/fuzz_target/struct2json/demo/../cJSON/cJSON.c:254:27
#2 0x5b32d9f46f27 in parse_array /home/cyd/fuzz_target/struct2json/demo/../cJSON/cJSON.c:1508:27
#3 0x5b32d9f46f27 in parse_value /home/cyd/fuzz_target/struct2json/demo/../cJSON/cJSON.c:1384:16
#4 0x5b32d9f4a04a in parse_object /home/cyd/fuzz_target/struct2json/demo/../cJSON/cJSON.c:1707:14
Indirect leak of 111 byte(s) in 12 object(s) allocated from:
#0 0x5b32d9f0418e in malloc (/home/cyd/fuzz_target/struct2json/demo/tests2j+0xdc18e) (BuildId: 58a8635ba9bb2828)
#1 0x5b32d9f47e11 in parse_string /home/cyd/fuzz_target/struct2json/demo/../cJSON/cJSON.c:840:34
SUMMARY: AddressSanitizer: 943 byte(s) leaked in 25 allocation(s).
Summary
When building and running the demo binary with AddressSanitizer/LeakSanitizer enabled,
tests2jreports a memory leak indemo/my_struct_2_json.c::s2j_test2().The leaked object is allocated by
cJSON_Parse()and is not released befores2j_test2()returns.Affected component
armink/struct2jsondemo/my_struct_2_json.cdemo/my_struct_2_json.incReproduction
Build the demo with ASan/LSan enabled:
Then excute the binary...