mirror of
https://github.com/github/codeql.git
synced 2026-04-30 03:05:15 +02:00
Merge pull request #362 from jbj/return-this-noreturn
C++: Fix "Overloaded assignment does not return 'this'" for non-returning functions
This commit is contained in:
@@ -112,6 +112,65 @@ private:
|
||||
int val;
|
||||
};
|
||||
|
||||
struct Exception {
|
||||
virtual ~Exception();
|
||||
};
|
||||
|
||||
class AlwaysThrows {
|
||||
public:
|
||||
AlwaysThrows &operator=(int _val) { // GOOD (always throws)
|
||||
throw Exception();
|
||||
// No `return` statement is generated by the C++ front end because it can
|
||||
// statically see that the end of the function is unreachable.
|
||||
}
|
||||
|
||||
AlwaysThrows &operator=(int *_val) { // GOOD (always throws)
|
||||
int one = 1;
|
||||
if (one)
|
||||
throw Exception();
|
||||
// A `return` statement is generated by the C++ front end, but the
|
||||
// control-flow pruning in QL will establish that this is unreachable.
|
||||
}
|
||||
};
|
||||
|
||||
class Reachability {
|
||||
Reachability &operator=(Reachability &that) { // GOOD
|
||||
int one = 1;
|
||||
if (one)
|
||||
return *this;
|
||||
else
|
||||
return that; // unreachable
|
||||
}
|
||||
|
||||
// helper function that always returns a reference to `*this`.
|
||||
Reachability &returnThisReference() {
|
||||
int one = 1;
|
||||
if (one)
|
||||
return *this;
|
||||
else
|
||||
return staticInstance; // unreachable
|
||||
}
|
||||
|
||||
// helper function that always returns `this`.
|
||||
Reachability *const returnThisPointer() {
|
||||
int one = 1;
|
||||
if (one)
|
||||
return this;
|
||||
else
|
||||
return &staticInstance; // unreachable
|
||||
}
|
||||
|
||||
Reachability &operator=(int _val) { // GOOD
|
||||
return returnThisReference();
|
||||
}
|
||||
|
||||
Reachability &operator=(short _val) { // GOOD
|
||||
return *returnThisPointer();
|
||||
}
|
||||
|
||||
static Reachability staticInstance;
|
||||
};
|
||||
|
||||
int main() {
|
||||
Container c;
|
||||
c = c;
|
||||
|
||||
Reference in New Issue
Block a user