serenity
serenity copied to clipboard
Can't including <algorithm> and <syscall.h> from c++ programs
When including algorithm
and syscall.h
from a c++ program, ambiguous function errors are raised.
Why do you need this?
I would like to make progress adding serenity support to a a system call fuzzer named syzkaller (https://github.com/SerenityOS/serenity/issues/1025). I have a POC, but it requires a few hacks that aren't upstreamable. This is one of them.
Minimal Repro
dummy.cpp:
#include <algorithm>
#include <syscall.h>
int main(int argc, char const *argv[])
{
if (std::max(0, 1)) {
syscall0((uintptr_t)NULL);
}
}
Compiler Output
$ ~/repos/upstream/serenity/Toolchain/Local/i686/bin/i686-pc-serenity-gcc -lsystem -std=c++20 -o ./dummy dummy.cpp
In file included from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/Types.h:11,
from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/Forward.h:9,
from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/Concepts.h:9,
from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/Checked.h:31,
from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/StringView.h:10,
from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/Kernel/API/Syscall.h:9,
from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/syscall.h:9,
from dummy.cpp:2:
/Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/StdLibExtras.h: In instantiation of 'constexpr T AK::exchange(T&, U&&) [with T = unsigned int; U = int]':
/Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/Checked.h:133:27: required from 'constexpr AK::Checked<T>::Checked(AK::Checked<T>&&) [with T = unsigned int]'
/Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/Checked.h:342:12: required from 'constexpr AK::Checked<T> AK::operator*(const AK::Checked<T>&, const AK::Checked<T>&) [with T = unsigned int]'
/Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/kmalloc.h:44:21: required from here
/Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/StdLibExtras.h:130:22: error: call of overloaded 'forward<int>(int&)' is ambiguous
130 | slot = forward<U>(value);
| ~~~~~~~~~~^~~~~~~
/Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/StdLibExtras.h:35:15: note: candidate: 'constexpr T&& std::forward(AK::Detail::RemoveReference<T>&) [with T = int; AK::Detail::RemoveReference<T> = int]'
35 | constexpr T&& forward(AK::Detail::RemoveReference<T>& param)
| ^~~~~~~
In file included from /Users/space/repos/upstream/serenity/Toolchain/Local/i686/i686-pc-serenity/include/c++/11.2.0/bits/stl_pair.h:59,
from /Users/space/repos/upstream/serenity/Toolchain/Local/i686/i686-pc-serenity/include/c++/11.2.0/utility:70,
from /Users/space/repos/upstream/serenity/Toolchain/Local/i686/i686-pc-serenity/include/c++/11.2.0/algorithm:60,
from dummy.cpp:1:
/Users/space/repos/upstream/serenity/Toolchain/Local/i686/i686-pc-serenity/include/c++/11.2.0/bits/move.h:77:5: note: candidate: 'constexpr _Tp&& std::forward(typename std::remove_reference<_Tp>::type&) [with _Tp = int; typename std::remove_reference<_Tp>::type = int]'
77 | forward(typename std::remove_reference<_Tp>::type& __t) noexcept
| ^~~~~~~
In file included from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/Types.h:11,
from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/Forward.h:9,
from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/Concepts.h:9,
from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/Checked.h:31,
from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/StringView.h:10,
from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/Kernel/API/Syscall.h:9,
from /Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/syscall.h:9,
from dummy.cpp:2:
/Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/StdLibExtras.h: In instantiation of 'constexpr T AK::exchange(T&, U&&) [with T = bool; U = bool]':
/Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/Checked.h:134:30: required from 'constexpr AK::Checked<T>::Checked(AK::Checked<T>&&) [with T = unsigned int]'
/Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/Checked.h:342:12: required from 'constexpr AK::Checked<T> AK::operator*(const AK::Checked<T>&, const AK::Checked<T>&) [with T = unsigned int]'
/Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/kmalloc.h:44:21: required from here
/Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/StdLibExtras.h:130:22: error: call of overloaded 'forward<bool>(bool&)' is ambiguous
130 | slot = forward<U>(value);
| ~~~~~~~~~~^~~~~~~
/Users/space/repos/upstream/serenity/Build/i686/Root/usr/include/AK/StdLibExtras.h:35:15: note: candidate: 'constexpr T&& std::forward(AK::Detail::RemoveReference<T>&) [with T = bool; AK::Detail::RemoveReference<T> = bool]'
35 | constexpr T&& forward(AK::Detail::RemoveReference<T>& param)
| ^~~~~~~
In file included from /Users/space/repos/upstream/serenity/Toolchain/Local/i686/i686-pc-serenity/include/c++/11.2.0/bits/stl_pair.h:59,
from /Users/space/repos/upstream/serenity/Toolchain/Local/i686/i686-pc-serenity/include/c++/11.2.0/utility:70,
from /Users/space/repos/upstream/serenity/Toolchain/Local/i686/i686-pc-serenity/include/c++/11.2.0/algorithm:60,
from dummy.cpp:1:
/Users/space/repos/upstream/serenity/Toolchain/Local/i686/i686-pc-serenity/include/c++/11.2.0/bits/move.h:77:5: note: candidate: 'constexpr _Tp&& std::forward(typename std::remove_reference<_Tp>::type&) [with _Tp = bool; typename std::remove_reference<_Tp>::type = bool]'
77 | forward(typename std::remove_reference<_Tp>::type& __t) noexcept
| ^~~~~~~
Full repro steps in https://github.com/SerenityOS/serenity/issues/1025#issuecomment-1114252275
@ADKaster let me know on discord that #define AK_DONT_REPLACE_STD 1
before includes works as a workaround to prevent AK things from leaking into LibC headers. However it would be nice to make syscall.h C clean.
Hi @HerrSpace
These kind of errors happen because into SerenityOS code is discouraged the use of the libstc++
, try use the LibAK instead
@MarcoCicognani have you even read the issue description? This is for a port.
This should work with AK_DONT_REPLACE_STD in combination with USING_AK_GLOBALLY.