aboutsummaryrefslogtreecommitdiffstats
path: root/tests/returning-data-from-temporary/main.cpp
blob: 1b84fc1474d9485adaf9980e6dfbdfc1cd34f522 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <QtCore/QString>
#include <QtCore/QByteArray>

QByteArray returnsByteArray()
{
    return QByteArray();
}

const QByteArray returnsConstByteArray()
{
    return QByteArray();
}

struct A
{
    QByteArray member;
    const char * returnsFromMember()
    {
        return member.data(); // OK
    }

    const char * returnsFromMember2()
    {
        return member.constData(); // OK
    }
};

const char * returnsFromLocal()
{
    QByteArray b;
    return b.data(); // Warn
}

const char * returnsFromLocal2()
{
    QByteArray b;
    return b.constData(); // Warning
}

const char * returnsFromConstLocal()
{
    const QByteArray b;
    return b.data(); // OK
}

const char * returnsFromConstLocalPtr()
{
    const QByteArray *b;
    return b->data(); // OK
}

const char * returnsFromConstLocalPtr2()
{
    QByteArray *const b = nullptr;
    return b->data(); // Warn
}

const char * returnsFromConstLocal2()
{
    const QByteArray b;
    return b.constData(); // OK
}

const char * returnsFromStaticLocal()
{
    static QByteArray b;
    return b.data(); // OK
}

const char * returnsFromStaticLocal2()
{
    static QByteArray b;
    return b.constData(); // OK
}

const char * returnsFromTemporary()
{
    return returnsByteArray().data(); // Warn
}

const char * returnsFromTemporary2()
{
    return returnsConstByteArray().data(); // Ok
}

const char * returnsFromTemporary3()
{
    QString s;
    return s.toUtf8().constData(); // Warn
    return s.toUtf8().data(); // Warn
    return s.toLatin1().data(); // Warn
    return s.toLatin1().constData(); // Warn
}

const char * returnsByteArrayCasted()
{
    return returnsByteArray(); // Warn
}

QString getString() { return QString(); }
const char * returnsFromTemporary4()
{
    return getString().toUtf8().constData(); // Warn
    return getString().toUtf8().data(); // Warn
    return getString().toLatin1().data(); // Warn
    return getString().toLatin1().constData(); // Warn
}

QByteArray castBackToByteArray()
{
    QByteArray b;
    return b.data(); // OK
    return getString().toUtf8().constData(); // OK
    return getString().toUtf8().data(); // OK
    return getString().toLatin1().data(); // OK
    return getString().toLatin1().constData(); // OK
}


void testAssignment()
{
    QByteArray b;
    QString str;
    const char *c1 = b.data(); // OK
    const char *c2 = b.constData(); // OK
    const char *c3 = b; // OK
    const char *c4 = str.toUtf8().data(); // Warn
    const char *c5 = str.toLatin1().data(); // Warn
    const char *c6 = str.toUtf8().constData(); // Warn
    const char *c7 = str.toLatin1().constData(); // Warn
    const char *c8 = str.toUtf8(); // Warn
    const char *c9 = str.toLatin1(); // Warn
    const char *c10 = returnsByteArray(); // Warn
}

const char * testByParam(QByteArray &ba, QString &foo, QByteArray ba2)
{
    return ba.data(); // OK
    return ba.constData(); // OK
    return ba; // OK
    return ba2; // Warn
    return foo.toLatin1().data(); // Warn
}