serenity icon indicating copy to clipboard operation
serenity copied to clipboard

Can't including <algorithm> and <syscall.h> from c++ programs

Open RonjaPonja opened this issue 2 years ago • 4 comments

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
      |     ^~~~~~~

RonjaPonja avatar May 01 '22 14:05 RonjaPonja

Full repro steps in https://github.com/SerenityOS/serenity/issues/1025#issuecomment-1114252275

RonjaPonja avatar May 01 '22 14:05 RonjaPonja

@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.

RonjaPonja avatar May 01 '22 14:05 RonjaPonja

Hi @HerrSpace These kind of errors happen because into SerenityOS code is discouraged the use of the libstc++, try use the LibAK instead

MarcoCicognani avatar Oct 18 '22 07:10 MarcoCicognani

@MarcoCicognani have you even read the issue description? This is for a port.

linusg avatar Oct 18 '22 11:10 linusg

This should work with AK_DONT_REPLACE_STD in combination with USING_AK_GLOBALLY.

kleinesfilmroellchen avatar Dec 12 '22 20:12 kleinesfilmroellchen