summaryrefslogblamecommitdiff
path: root/test/test29.cpp
blob: 115fc3426cfb33d963adcea195fb313bcbd3c8df (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11










                           
                     















                                                                                            




                       






                                                                      




                                                                          
                   
         










                                                                     
                                        










                                                                      
                    

























                                                                     

























                                                                      
                                        










                                                                      
                    




























































































































































































































































                                                                                                                                           



























































                                                                                                    












                                                                         














                                                       
  
struct Data1;

struct Data1
{
    int val;
    Data1 *ptrval;
    int arr[3];
};

struct Data2 : public Data1
{
    virtual ~Data2();
};

int k;

void paranuckerInternalTest(const char *action, const char *collection, const char *values);

class Object1
{
    Data1 *tmp1;
    Data1 *tmp2;

    Data1 *getData()
    {
        return tmp1;
    }

    Data2 *getData2()
    {
        return nullptr;
    }

    void func1(Data1 *ptr1, Data1 *ptr2)
    {
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
        if (!ptr2)
        {
            paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "ptr2");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
            return;
        }
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "ptr2");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1");
        ptr1 = ptr2;
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "");
    }

    void func2(Data1 *ptr1, Data1 *ptr2)
    {
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
        if (!ptr2)
            return;
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "ptr2");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1");
        ptr1 = ptr2;
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "");
    }

    Data1 *func3(Data1 *ptr2)
    {
        Data1 *ptr1;
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
        if (!ptr2)
            return 0;
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "ptr2");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "");
        ptr1 = ptr2;
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "");
        return ptr1;
    }

    void func4(Data1 *ptr1, Data1 *ptr2)
    {
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
        if (ptr2)
        {
            paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "ptr2");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr1");
            return;
        }
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "ptr2");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
        ptr1 = ptr2;
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
    }

    void func5(Data1 *ptr1, Data1 *ptr2)
    {
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
        if (ptr2)
            return;
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "ptr2");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
        ptr1 = ptr2;
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
    }

    Data1 *func6(Data1 *ptr2)
    {
        Data1 *ptr1;
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
        if (ptr2)
            return 0;
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "ptr2");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
        ptr1 = ptr2;
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
        return ptr1;
    }

    void func7(Data1 *ptr2)
    {
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
        // null || 10 -> return
        // null || 9  -> return
        // 123  || 10 -> return
        // 123  || 9  -> continue
        // wco if_stmt  clean checkedElseNonNullVars:ptr2,  needCheckNullVars:ptr2,  knownVars:ptr2,
        if (!ptr2 || k == 10)
        {
            paranuckerInternalTest("=", "knownVars", "ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
            return;
        }
        else
        {
            paranuckerInternalTest("=", "knownVars", "ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "ptr2");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "");
        }
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "ptr2");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "");
    }

    void func8(Data1 *ptr2)
    {
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
        // null && 10 -> return
        // null && 9  -> continue
        // 123  && 10 -> continue
        // 123  && 9  -> continue
        // wco if_stmt  needCheckNullVars:ptr2,  knownVars:ptr2,  knownNullVars:ptr2,
        if (!ptr2 && k == 10)
        {
            paranuckerInternalTest("=", "knownVars", "ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "ptr2");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
            return;
        }
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
    }

    void func9(Data1 *ptr2)
    {
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
        // null || 10 -> return
        // null || 9  -> contine
        // 123  || 10 -> return
        // 123  || 9  -> return
        // wco if_stmt  clean needCheckNullVars:ptr2,  knownVars:ptr2,
        if (ptr2 || k == 10)
        {
            paranuckerInternalTest("=", "knownVars", "ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
            return;
        }
        else
        {
            paranuckerInternalTest("=", "knownVars", "ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "ptr2");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
        }
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "ptr2");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
    }

    void func10(Data1 *ptr1, Data1 *ptr2)
    {
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
        // null || null -> continue
        // null || 123  -> return
        // 123  || null -> return
        // 123  || 123  -> return
        // wco if_stmt  clean checkedElseNullVars:ptr1, ptr2,  needCheckNullVars:ptr1, ptr2,  knownVars:ptr1, ptr2,
        if (ptr2 || ptr1)
        {
            paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
            return;
        }
        else
        {
            paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "ptr1 ptr2");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
        }
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
    }

    void func11(int *ptr1, int *ptr2)
    {
        // null && null || null -> continue
        // null && 123  || null -> continue
        // 123  && null || 123  -> return
        // 123  && 123  || 123  -> return
        // wco if_stmt  clean checkedThenNonNullVars:ptr1,  checkedElseNullVars:ptr1,  needCheckNullVars:ptr1, ptr2,  knownVars:ptr1, ptr2,
        if ((ptr1 && ptr2) || ptr1)
        {
            paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "ptr1");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
            return;
        }
        else
        {
            paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "ptr1");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
        }
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "ptr1");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
    }

    void func12(int *ptr1, int *ptr2)
    {
        // null || null && null -> continue
        // null || 123  && null -> continue
        // 123  || null && 123  -> return
        // 123  || 123  && 123  -> return
        if ((ptr1 || ptr2) && ptr1)
        {
            paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "ptr1");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
            return;
        }
        else
        {
            paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "ptr1");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
        }
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "ptr1");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
    }

    void func13(int *ptr1)
    {
        // null -> continue
        // 123  -> return
        if ((ptr1 || ptr1) && ptr1)
        {
            paranuckerInternalTest("=", "knownVars", "ptr1");
            paranuckerInternalTest("=", "knownNonNullVars", "ptr1");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "");
            return;
        }
        else
        {
            paranuckerInternalTest("=", "knownVars", "ptr1");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "ptr1");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr1");
        }
        paranuckerInternalTest("=", "knownVars", "ptr1");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "ptr1");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1");
    }

    void func14(int *ptr1)
    {
        // null -> continue
        // 123  -> return
        if ((ptr1 && ptr1) || ptr1)
        {
            paranuckerInternalTest("=", "knownVars", "ptr1");
            paranuckerInternalTest("=", "knownNonNullVars", "ptr1");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "");
            return;
        }
        else
        {
            paranuckerInternalTest("=", "knownVars", "ptr1");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "ptr1");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr1");
        }
        paranuckerInternalTest("=", "knownVars", "ptr1");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "ptr1");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1");
    }

    void func15(Data1 *ptr2)
    {
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
        // null || 10 -> continue
        // null || 9  -> continue
        // 123  || 10 -> continue
        // 123  || 9  -> return
        // wco if_stmt  clean checkedElseNonNullVars:ptr2,  needCheckNullVars:ptr2,  knownVars:ptr2,
        if (!ptr2 || k == 10)
        {
            paranuckerInternalTest("=", "knownVars", "ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
        }
        else
        {
            paranuckerInternalTest("=", "knownVars", "ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "ptr2");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "");
            return;
        }
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
    }

    void func16(Data1 *ptr2)
    {
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
        // wco if_stmt  clean checkedElseNonNullVars:ptr2,  needCheckNullVars:ptr2,  knownVars:ptr2,
        if (!ptr2 || k == 10)
        {
            paranuckerInternalTest("=", "knownVars", "ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "ptr2");
            return;
        }
        else
        {
            paranuckerInternalTest("=", "knownVars", "ptr2");
            paranuckerInternalTest("=", "knownNonNullVars", "ptr2");
            paranuckerInternalTest("=", "knownNullVars", "");
            paranuckerInternalTest("=", "needCheckNullVars", "");
            return;
        }
        paranuckerInternalTest("=", "knownVars", "ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "");
    }

    void func17(Data1 *ptr1, const Data2 *const ptr2)
    {
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
        const Data1 *const ptr3 = dynamic_cast<const Data1* const>(ptr2);
        paranuckerInternalTest("=", "knownVars", "ptr1 ptr2");
        paranuckerInternalTest("=", "knownNonNullVars", "");
        paranuckerInternalTest("=", "knownNullVars", "");
        paranuckerInternalTest("=", "needCheckNullVars", "ptr1 ptr2");
    }

    int func18()
    {
        Data1 *ptr1 = dynamic_cast<Data1*>(getData2());
        tmp2 = ptr1;
        if (tmp2)
        {
            if (k == 10)
            {
                int val = ptr1->val;
                return val;
            }
        }
        return 0;
    }
};