Skip to content

Memory leak in demo s2j_test2 detected by LeakSanitizer #38

@cccccyd

Description

@cccccyd

Summary

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().

The leaked object is allocated by cJSON_Parse() and is not released before s2j_test2() returns.

Affected component

  • Repository: armink/struct2json
  • Component: demo/test code
  • Files:
    • demo/my_struct_2_json.c
    • demo/my_struct_2_json.inc

Reproduction

Build the demo with ASan/LSan enabled:

cd demo
clang -g -O1 -fsanitize=address \
  ../cJSON/cJSON.c ../struct2json/src/*.c \
  ./*.c \
  -I ../cJSON/ -I ../struct2json/inc/ \
  -lm -DDEBUGS2J -o tests2j

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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions