Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix gcc warnings when building with optimizations. #672

Merged
merged 3 commits into from
Apr 29, 2024

Conversation

clalancette
Copy link
Contributor

When building the allocator_tutorial_pmr demo with -O2, gcc is throwing an error saying that new and delete are mismatched. This is something of a misnomer, however; the real problem is that the global new override we have in that demo is actually implemented incorrectly.

In particular, the documentation at
https://en.cppreference.com/w/cpp/memory/new/operator_new very clearly specifies that operator new either has to return a valid pointer, or throw an exception on error. Our version wasn't throwing the exception, so change it to throw std::bad_alloc if std::malloc fails.

While we are in here, also fix another small possible is where std::malloc could return nullptr on a zero-sized object, thus throwing an exception it shouldn't.

When building the allocator_tutorial_pmr demo with -O2,
gcc is throwing an error saying that new and delete are
mismatched.  This is something of a misnomer, however;
the real problem is that the global new override we
have in that demo is actually implemented incorrectly.

In particular, the documentation at
https://en.cppreference.com/w/cpp/memory/new/operator_new
very clearly specifies that operator new either has to
return a valid pointer, or throw an exception on error.
Our version wasn't throwing the exception, so change it
to throw std::bad_alloc if std::malloc fails.

While we are in here, also fix another small possible
is where std::malloc could return nullptr on a zero-sized
object, thus throwing an exception it shouldn't.

Signed-off-by: Chris Lalancette <clalancette@gmail.com>
@clalancette
Copy link
Contributor Author

CI:

  • Linux Build Status
  • Linux-aarch64 Build Status
  • Windows Build Status

That's because gcc 13 has a bug where it can sometimes
inline one or the other, and then it detects that they
mismatch.  For gcc and clang, just force them to always
be inline in this demo.

Signed-off-by: Chris Lalancette <clalancette@gmail.com>
@clalancette
Copy link
Contributor Author

clalancette commented Apr 27, 2024

CI:

  • Linux Build Status
  • Linux-aarch64 Build Status
  • Windows Build Status
  • Clang Build Status

Copy link
Collaborator

@fujitatomoya fujitatomoya left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm with green CI.

Both clang and MSVC don't like inlining these, so instead
ensure that they are *not* inlined.  This also works
because the problem is when new is inlined but not delete
(or vice-versa).  As long as they are both not inlined,
this should fix the warning.

Signed-off-by: Chris Lalancette <clalancette@gmail.com>
@clalancette
Copy link
Contributor Author

CI:

  • Linux Build Status
  • Linux-aarch64 Build Status
  • Windows Build Status
  • Clang Build Status

@ahcorde ahcorde merged commit 957ddbb into rolling Apr 29, 2024
3 checks passed
@delete-merged-branch delete-merged-branch bot deleted the clalancette/fix-alloc-warnings branch April 29, 2024 08:05
@ahcorde
Copy link

ahcorde commented Apr 29, 2024

https://github.com/Mergifyio backport jazzy

Copy link

mergify bot commented Apr 29, 2024

backport jazzy

✅ Backports have been created

mergify bot pushed a commit that referenced this pull request Apr 29, 2024
* Fix gcc warnings when building with optimizations.

When building the allocator_tutorial_pmr demo with -O2,
gcc is throwing an error saying that new and delete are
mismatched.  This is something of a misnomer, however;
the real problem is that the global new override we
have in that demo is actually implemented incorrectly.

In particular, the documentation at
https://en.cppreference.com/w/cpp/memory/new/operator_new
very clearly specifies that operator new either has to
return a valid pointer, or throw an exception on error.
Our version wasn't throwing the exception, so change it
to throw std::bad_alloc if std::malloc fails.

While we are in here, also fix another small possible
is where std::malloc could return nullptr on a zero-sized
object, thus throwing an exception it shouldn't.

Signed-off-by: Chris Lalancette <clalancette@gmail.com>

* Always inline the new and delete operators.

That's because gcc 13 has a bug where it can sometimes
inline one or the other, and then it detects that they
mismatch.  For gcc and clang, just force them to always
be inline in this demo.

Signed-off-by: Chris Lalancette <clalancette@gmail.com>

* Switch to NOINLINE instead.

Both clang and MSVC don't like inlining these, so instead
ensure that they are *not* inlined.  This also works
because the problem is when new is inlined but not delete
(or vice-versa).  As long as they are both not inlined,
this should fix the warning.

Signed-off-by: Chris Lalancette <clalancette@gmail.com>
(cherry picked from commit 957ddbb)
ahcorde pushed a commit that referenced this pull request Apr 29, 2024
* Fix gcc warnings when building with optimizations.

When building the allocator_tutorial_pmr demo with -O2,
gcc is throwing an error saying that new and delete are
mismatched.  This is something of a misnomer, however;
the real problem is that the global new override we
have in that demo is actually implemented incorrectly.

In particular, the documentation at
https://en.cppreference.com/w/cpp/memory/new/operator_new
very clearly specifies that operator new either has to
return a valid pointer, or throw an exception on error.
Our version wasn't throwing the exception, so change it
to throw std::bad_alloc if std::malloc fails.

While we are in here, also fix another small possible
is where std::malloc could return nullptr on a zero-sized
object, thus throwing an exception it shouldn't.

Signed-off-by: Chris Lalancette <clalancette@gmail.com>

* Always inline the new and delete operators.

That's because gcc 13 has a bug where it can sometimes
inline one or the other, and then it detects that they
mismatch.  For gcc and clang, just force them to always
be inline in this demo.

Signed-off-by: Chris Lalancette <clalancette@gmail.com>

* Switch to NOINLINE instead.

Both clang and MSVC don't like inlining these, so instead
ensure that they are *not* inlined.  This also works
because the problem is when new is inlined but not delete
(or vice-versa).  As long as they are both not inlined,
this should fix the warning.

Signed-off-by: Chris Lalancette <clalancette@gmail.com>
(cherry picked from commit 957ddbb)

Co-authored-by: Chris Lalancette <clalancette@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants