Skip to content

Commit a5ec929

Browse files
Fix #14340 FN containerOutOfBounds with std::initializer_list (danmar#8059)
Co-authored-by: chrchr-github <[email protected]>
1 parent dfdfad0 commit a5ec929

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

cfg/std.cfg

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9009,6 +9009,16 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init
90099009
<container id="stdBasicStringView" startPattern="std :: basic_string_view &lt;" inherits="stdAllStringView">
90109010
<type templateParameter="0"/>
90119011
</container>
9012+
<container id="stdInitializerList" startPattern="std :: initializer_list &lt;" endPattern="&gt; !!::" opLessAllowed="false" itEndPattern="&gt; :: iterator|const_iterator" hasInitializerListConstructor="true">
9013+
<type templateParameter="0"/>
9014+
<size>
9015+
<function name="size" yields="size" returnType="std::size_t"/>
9016+
</size>
9017+
<access>
9018+
<function name="begin" yields="start-iterator"/>
9019+
<function name="end" yields="end-iterator"/>
9020+
</access>
9021+
</container>
90129022
<container id="stdStringView" startPattern="std :: string_view|wstring_view|u16string_view|u32string_view" endPattern="" inherits="stdAllStringView"/>
90139023
<container id="stdExperimentalStringView" startPattern="std :: experimental :: string_view|wstring_view|u16string_view|u32string_view" endPattern="" inherits="stdAllStringView"/>
90149024
<container id="stdExperimentalBasicStringView" startPattern="std :: experimental :: basic_string_view &lt;" inherits="stdBasicStringView" />

lib/checkother.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1513,6 +1513,8 @@ void CheckOther::commaSeparatedReturnError(const Token *tok)
15131513
static bool isLargeContainer(const Variable* var, const Settings& settings)
15141514
{
15151515
const ValueType* vt = var->valueType();
1516+
if (vt->container->startPattern == "std :: initializer_list <")
1517+
return false;
15161518
if (vt->container->size_templateArgNo < 0)
15171519
return true;
15181520
const std::size_t maxByValueSize = 2 * settings.platform.sizeof_pointer;

test/cfg/std.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5307,3 +5307,15 @@ void containerOutOfBounds_std_string(std::string &var) { // #11403
53075307
// TODO cppcheck-suppress containerOutOfBounds
53085308
var+= s5[3];
53095309
}
5310+
5311+
int containerOutOfBounds_std_initializer_list_access(const std::vector<int>& v) {
5312+
// cppcheck-suppress containerOutOfBounds
5313+
return v[2];
5314+
}
5315+
5316+
int containerOutOfBounds_std_initializer_list() { // #14340
5317+
std::initializer_list<int> x{ 1, 2 };
5318+
// cppcheck-suppress derefInvalidIterator
5319+
int i = *x.end();
5320+
return i + containerOutOfBounds_std_initializer_list_access(x);
5321+
}

0 commit comments

Comments
 (0)