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 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
#include <QtCore/QList>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QMap>
#include <QtCore/QFile>
#include <QtCore/QHash>
#include <QtCore/QSet>
#include <QtCore/QJsonObject>
QList<int> getList()
{
return QList<int>();
}
void detach1()
{
getList().constFirst(); // Warning
}
void detach2()
{
getList().at(0); // OK
}
void lvalue()
{
QStringList s;
s.first(); // OK
}
QStringList test_string() { return {}; }
QStringList& test_string_ref() { static QStringList s; return s; }
QStringList * test_string_ptr() { return {}; }
const QStringList test_const_string() { return {}; }
const QStringList & test_const_string_ref() { static QStringList s; return s; }
const QStringList * test_const_string_ptr() { return {}; }
void qstrings()
{
QString s;
s.toLatin1().data(); // OK, list isn't shared
test_string().constFirst(); // Warning
test_const_string().first(); // OK
test_const_string_ref().first(); // OK
test_const_string_ptr()->first(); // OK
test_string().constFirst(); // Warning
test_string_ref().first(); // Warning
test_string_ptr()->first(); // OK
}
void more()
{
QFile::encodeName("foo").data();
}
void foo(QStringList *list)
{
auto it = list->begin();
}
typedef QMap<int, QStringList> StringMap;
Q_GLOBAL_STATIC(StringMap, sISOMap)
void test_global_static()
{
sISOMap()->insert(1, QStringList());
sISOMap->insert(1, QStringList());
}
struct TestThis : public QList<int>
{
void foo()
{
begin();
}
};
class Foo
{
public:
QStringList list;
};
Foo * getFoo() { return new Foo(); }
Foo getFoo2() { return Foo(); }
void testThroughPointer()
{
Foo *f;
f->list.first(); // OK
getFoo()->list.first(); // OK
getFoo2().list.first(); // OK
}
QMap<int,int> getMap() { return {}; };
void testWriteMethod()
{
getMap().insert(1,1); // Warning
int a = getMap().take(1); // Warning
}
void testSubscriptOperator()
{
getList().at(0); // Warning
if (test_string().at(0).isEmpty()) {} // Warning
getMap().value(0); // Warning
auto m = getMap();
m[0];
getList() .at(0); // Warning, test correct fixit range here
getList().at(0); // Warning, test correct fixit range here
}
typedef QList<int> IntList;
IntList getIntList() { return {}; }
void testTypedef()
{
getIntList().at(0); // Warning
}
QStringList getStringList() { return {}; }
void testDerivedClass()
{
getStringList().constFirst(); // Warning
getStringList().at(0); // Warning
}
void testQStringListSpecificMethods()
{
getStringList().removeDuplicates();
}
QString getString() { return ""; }
void testQString()
{
getString().cbegin(); // Warning
getString().at(1); // Warning
}
extern QHash<QString, int> &initializers();
QString getStr() { return QString(); }
static auto bar = [] {
return initializers().insert(getStr(), 1); // OK
}();
QSet<int> getSet() { return {}; }
void testIntersect()
{
QSet<int> other;
auto s = getSet().intersect(other); // OK
}
QJsonObject getObj(){return {};}
void testJsonDetach() {
getObj().value(QLatin1String("bla")); // Warning
getObj().constFind(QLatin1String("bla")); // Warning
getObj().value(QLatin1String("bla")); // OK
}
void testRIterators()
{
getList().crbegin();
getList().crend();
getStringList().crbegin();
getStringList().crend();
}
QVariantList getVariantList(){return {};}
void chainedCalls()
{
getVariantList().constLast().toStringList().constFirst()[0]; // Warn, twice
getStringList().at(0)[0]; // Warn, but only once due to whitelisting
getStringList().at(0)[0]; // OK, .at gives us a const value
getVariantList().constFirst().toString().at(0); // Warn, detach
getVariantList().at(0).toString().at(0); // Warn, detach twice
}
|