Skip to content

Commit e031165

Browse files
authored
Fix #14370 (False negative: missingReturn in catch) (danmar#8095)
1 parent e2640e7 commit e031165

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

lib/checkfunctions.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,19 @@ static const Token *checkMissingReturnScope(const Token *tok, const Library &lib
396396
if (Token::simpleMatch(tok->tokAt(-2), "} else {"))
397397
return checkMissingReturnScope(tok->tokAt(-2), library);
398398
return tok;
399+
} else if (tok->scope()->type == ScopeType::eCatch) {
400+
while (tok->str() == "}") {
401+
const Token *errorToken = checkMissingReturnScope(tok, library);
402+
if (errorToken || tok->scope()->type == ScopeType::eTry)
403+
return errorToken;
404+
tok = tok->link();
405+
if (Token::simpleMatch(tok->previous(), ") {") && Token::simpleMatch(tok->linkAt(-1)->tokAt(-2), "} catch ("))
406+
tok = tok->linkAt(-1)->tokAt(-2);
407+
else
408+
break;
409+
}
410+
// FIXME this should not be reached
411+
return nullptr;
399412
}
400413
// FIXME
401414
return nullptr;

test/testfunctions.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ class TestFunctions : public TestFixture {
8585
TEST_CASE(checkMissingReturn4);
8686
TEST_CASE(checkMissingReturn5);
8787
TEST_CASE(checkMissingReturn6); // #13180
88+
TEST_CASE(checkMissingReturn7); // #14370 - FN try/catch
8889

8990
// std::move for locar variable
9091
TEST_CASE(returnLocalStdMove1);
@@ -1880,6 +1881,43 @@ class TestFunctions : public TestFixture {
18801881
ASSERT_EQUALS("[test.cpp:3:5]: (error) Found an exit path from function with non-void return type that has missing return statement [missingReturn]\n", errout_str());
18811882
}
18821883

1884+
void checkMissingReturn7() {// #14370 FN try/catch
1885+
check("int foo(void) {\n"
1886+
" try { return readData(); }\n"
1887+
" catch (...) {}\n"
1888+
"}\n");
1889+
ASSERT_EQUALS("[test.cpp:3:18]: (error) Found an exit path from function with non-void return type that has missing return statement [missingReturn]\n", errout_str());
1890+
1891+
check("int foo(void) {\n"
1892+
" try { return readData(); }\n"
1893+
" catch (const E& e) {}\n"
1894+
" catch (...) { return 2; }\n"
1895+
"}\n");
1896+
ASSERT_EQUALS("[test.cpp:3:25]: (error) Found an exit path from function with non-void return type that has missing return statement [missingReturn]\n", errout_str());
1897+
1898+
check("int foo(void) {\n"
1899+
" try { x=1; }\n"
1900+
" catch (...) { return 2; }\n"
1901+
"}\n");
1902+
ASSERT_EQUALS("[test.cpp:2:11]: (error) Found an exit path from function with non-void return type that has missing return statement [missingReturn]\n", errout_str());
1903+
1904+
check("int foo(void) {\n"
1905+
" try { return readData(); }\n"
1906+
" catch (...) { return 0; }\n"
1907+
"}\n");
1908+
ASSERT_EQUALS("", errout_str());
1909+
1910+
check("int foo(void)\n"
1911+
" try { x=1; }\n"
1912+
" catch (...) { return 2; }\n");
1913+
ASSERT_EQUALS("[test.cpp:2:11]: (error) Found an exit path from function with non-void return type that has missing return statement [missingReturn]\n", errout_str());
1914+
1915+
check("int foo(void)\n"
1916+
" try { return readData(); }\n"
1917+
" catch (...) { }\n");
1918+
ASSERT_EQUALS("[test.cpp:3:19]: (error) Found an exit path from function with non-void return type that has missing return statement [missingReturn]\n", errout_str());
1919+
}
1920+
18831921
// NRVO check
18841922
void returnLocalStdMove1() {
18851923
check("struct A{}; A f() { A var; return std::move(var); }");

0 commit comments

Comments
 (0)