microsoft / microsoft/mimalloc

mimalloc-override.h does not work correctly with namespaces

Open
#1,136 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
C
Stars
13.4k
Forks
1.2k
Avg merge
4d 45m
Merged PRs (30d)
13

Description

Hello! Recently, I decided to build a project with Clang using mimalloc. I opted for overriding through header files, as I believe this is the most reliable and controllable way to override calls. The flags are quite simple for this:

```
C*FLAGS="-include mimalloc-override.h"
LDFLAGS="-lmimalloc"
```

However, Clang failed to compile with errors

```
/usr/lib/llvm/21/include/llvm/Support/MemAlloc.h:53:18: error: no member named 'mi_realloc' in namespace 'std'; did you mean simply 'mi_realloc'?
53 | void *Result = std::realloc(Ptr, Sz);
| ^ ~~~~~~~~~~~~~~~~
/usr/include/mimalloc.h:111:40: note: 'mi_realloc' declared here
```

It seems that the method of overriding using `#define` does not account for calls that may use namespaces (or their aliases). For now, one option I see is to add definitions of `mi_realloc` into the `std` namespace, creating something like this:

**mimalloc-override.h**
```cpp
#include

#define malloc(n) mi_malloc(n)

#if defined(__cplusplus)
namespace std {
inline auto mi_malloc(size_t n) { return ::mi_malloc(n); }
}
#endif
```

**out.cpp**
```cpp
#include "mimalloc-override.h"
#include

int main() {
auto _ = std::malloc(8);
}
```

**preprocessed_out.cpp**
```cpp
# 2 "./mimalloc-override.h" 2

namespace std {
inline auto mi_malloc(size_t n) { return ::mi_malloc(n); }
}
# 2 "out.cpp" 2

int main() {
auto _ = std::mi_malloc(8);
}
```

Thank you for your time and for the great project! :)

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with mimalloc-override.h and reproduce the failure using the -include mimalloc-override.h and -lmimalloc flags, then inspect the namespace-qualified calls shown from llvm/Support/MemAlloc.h. Verify the override behavior for std::malloc and std::realloc, and add coverage demonstrating that the affected Clang compilation succeeds.

Written by the indexing model from the issue text.

Assessment

Tech stack
c, cpp
Domain
tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.