8 Jun 2021 |
manveru | Regnat: i don't particularly want to do it, since I'm pretty much a noob when it comes to C++, but i guess it doesn't hurt to learn and beats waiting :) | 07:49:04 |
manveru | at least it doesn't look like those nasty race conditions and GC segfaults, so I might have a chance to actually understand it | 07:50:14 |
Regnat | In reply to @manveru:matrix.org Regnat: i don't particularly want to do it, since I'm pretty much a noob when it comes to C++, but i guess it doesn't hurt to learn and beats waiting :) I didn’t try it, but I guess just changing the logic here to handle the case where attrSet->pos == nullptr should be enough for a quick fix | 07:56:12 |
manveru | ok, thanks | 07:59:37 |
manveru | Regnat: so... comparing doesn't seem to work, no match for ‘operator==’ (operand types are ‘nix::Pos’ and ‘std::nullptr_t’) | 08:10:20 |
manveru | i guess this has to happen before it dereferences the pointer | 08:11:14 |
Regnat | Yes, it has to, the lhs of the == should be a nix::Pos* . What did you write precisely. | 08:11:52 |
Regnat | * Yes, it has to, the lhs of the == should be a nix::Pos* . What did you write precisely? | 08:11:54 |
manveru | gotta wait for the compilation... seems to get further now :) | 08:14:42 |
manveru | running make in the devShell seems to fail because of some aws thingy, but nix build .#nix works | 08:18:55 |
manveru | In file included from /nix/store/cfkfpca5ymx2rf66k6f16sa3lb6ndgc2-gcc-10.3.0/include/c++/10.3.0/x86_64-unknown-linux-gnu/bits/c++allocator.h:33,
from /nix/store/cfkfpca5ymx2rf66k6f16sa3lb6ndgc2-gcc-10.3.0/include/c++/10.3.0/bits/allocator.h:46,
from /nix/store/cfkfpca5ymx2rf66k6f16sa3lb6ndgc2-gcc-10.3.0/include/c++/10.3.0/memory:64,
from src/libutil/ref.hh:3,
from src/libstore/s3.hh:5,
from src/libstore/s3-binary-cache-store.cc:3:
/nix/store/cfkfpca5ymx2rf66k6f16sa3lb6ndgc2-gcc-10.3.0/include/c++/10.3.0/ext/new_allocator.h: In instantiation of ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = nix::AwsLogger; _Args = {const Aws::Utils::Logging::LogLevel&}; _Tp = nix::AwsLogger]’:
/nix/store/cfkfpca5ymx2rf66k6f16sa3lb6ndgc2-gcc-10.3.0/include/c++/10.3.0/bits/alloc_traits.h:512:17: required from ‘static void std::allocator_traits<std::allocator<_Tp1> >::construct(std::allocator_traits<std::allocator<_Tp1> >::allocator_type&, _Up*, _Args&& ...) [with _Up = nix::AwsLogger; _Args = {const Aws::Utils::Logging::LogLevel&}; _Tp = nix::AwsLogger; std::allocator_traits<std::allocator<_Tp1> >::allocator_type = std::allocator<nix::AwsLogger>]’
/nix/store/cfkfpca5ymx2rf66k6f16sa3lb6ndgc2-gcc-10.3.0/include/c++/10.3.0/bits/shared_ptr_base.h:551:39: required from ‘std::_Sp_counted_ptr_inplace<_Tp, _Alloc, _Lp>::_Sp_counted_ptr_inplace(_Alloc, _Args&& ...) [with _Args = {const Aws::Utils::Logging::LogLevel&}; _Tp = nix::AwsLogger; _Alloc = std::allocator<nix::AwsLogger>; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]’
/nix/store/cfkfpca5ymx2rf66k6f16sa3lb6ndgc2-gcc-10.3.0/include/c++/10.3.0/bits/shared_ptr_base.h:682:16: required from ‘std::__shared_count<_Lp>::__shared_count(_Tp*&, std::_Sp_alloc_shared_tag<_Alloc>, _Args&& ...) [with _Tp = nix::AwsLogger; _Alloc = std::allocator<nix::AwsLogger>; _Args = {const Aws::Utils::Logging::LogLevel&}; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]’
/nix/store/cfkfpca5ymx2rf66k6f16sa3lb6ndgc2-gcc-10.3.0/include/c++/10.3.0/bits/shared_ptr_base.h:1371:71: required from ‘std::__shared_ptr<_Tp, _Lp>::__shared_ptr(std::_Sp_alloc_shared_tag<_Tp>, _Args&& ...) [with _Alloc = std::allocator<nix::AwsLogger>; _Args = {const Aws::Utils::Logging::LogLevel&}; _Tp = nix::AwsLogger; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]’
/nix/store/cfkfpca5ymx2rf66k6f16sa3lb6ndgc2-gcc-10.3.0/include/c++/10.3.0/bits/shared_ptr.h:408:59: required from ‘std::shared_ptr<_Tp>::shared_ptr(std::_Sp_alloc_shared_tag<_Tp>, _Args&& ...) [with _Alloc = std::allocator<nix::AwsLogger>; _Args = {const Aws::Utils::Logging::LogLevel&}; _Tp = nix::AwsLogger]’
/nix/store/cfkfpca5ymx2rf66k6f16sa3lb6ndgc2-gcc-10.3.0/include/c++/10.3.0/bits/shared_ptr.h:859:14: required from ‘std::shared_ptr<_Tp> std::allocate_shared(const _Alloc&, _Args&& ...) [with _Tp = nix::AwsLogger; _Alloc = std::allocator<nix::AwsLogger>; _Args = {const Aws::Utils::Logging::LogLevel&}]’
/nix/store/cfkfpca5ymx2rf66k6f16sa3lb6ndgc2-gcc-10.3.0/include/c++/10.3.0/bits/shared_ptr.h:875:39: required from ‘std::shared_ptr<_Tp> std::make_shared(_Args&& ...) [with _Tp = nix::AwsLogger; _Args = {const Aws::Utils::Logging::LogLevel&}]’
src/libstore/s3-binary-cache-store.cc:82:83: required from here
/nix/store/cfkfpca5ymx2rf66k6f16sa3lb6ndgc2-gcc-10.3.0/include/c++/10.3.0/ext/new_allocator.h:150:4: error: invalid new-expression of abstract class type ‘nix::AwsLogger’
150 | { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/libstore/s3-binary-cache-store.cc:52:7: note: because the following virtual functions are pure within ‘nix::AwsLogger’:
52 | class AwsLogger : public Aws::Utils::Logging::FormattedLogSystem
| ^~~~~~~~~
In file included from /nix/store/pj9f7qgpvw27ri18hdk11bkp24lzqq2a-aws-sdk-cpp-1.8.121-dev/include/aws/core/Aws.h:8,
from src/libstore/s3-binary-cache-store.cc:11:
/nix/store/pj9f7qgpvw27ri18hdk11bkp24lzqq2a-aws-sdk-cpp-1.8.121-dev/include/aws/core/utils/logging/LogSystemInterface.h:46:30: note: ‘virtual void Aws::Utils::Logging::LogSystemInterface::Flush()’
46 | virtual void Flush() = 0;
| ^~~~~
make: *** [mk/patterns.mk:3: src/libstore/s3-binary-cache-store.o] Error 1
| 08:19:07 |
manveru | anyway, after the fix it doesn't segfault anymore | 08:20:06 |
manveru | ❮ ./result/bin/nix eval --expr 'builtins.listToAttrs [ (builtins.listToAttrs [ { name = "foo"; value = "bar"; } ])]'
error: attribute 'name' missing for call to 'listToAttrs'
at «string»:1:1:
1| builtins.listToAttrs [ (builtins.listToAttrs [ { name = "foo"; value = "bar"; } ])]
| ^
| 08:20:09 |
manveru | will see if that also fixes my original issue :) | 08:20:36 |
manveru | yep | 08:22:12 |
manveru | ❮ ~/github/nixos/nix/result/bin/nix build .#nixosConfigurations.alpha.config.system.build.toplevel
warning: Git tree '/home/manveru/nixos-conf' is dirty
error: attribute 'dc=iog' missing for call to 'getAttr'
at /nix/store/zjmnwn76xzxw3j7v1p98fd0aywpvyylf-source/nixos/modules/services/databases/openldap.nix:281:41:
280| mkLoadScript = dn: let
281| dataDir = lib.escapeShellArg (getAttr dn dataDirs);
| ^
282| in ''
(use '--show-trace' to show detailed location information)
| 08:22:29 |
manveru | much nicer :) | 08:22:31 |
manveru | now... how do you write a test for this? | 08:29:02 |
manveru | it seems like builtins.tryEval doesn't catch this still | 08:31:03 |
manveru | builtins.unsafeGetAttrPos "bar" (builtins.listToAttrs [ { name = "foo"; value = "bar"; } ]) returns null in both the fixed and unfixed version... | 08:33:00 |
Regnat | In reply to @manveru:matrix.org now... how do you write a test for this? That’s very good question. I fear the best solution is to grep stderr to ensure that there’s a proper error message and check the return code (should be different between a segfault and a proper exit) | 08:37:49 |
manveru | anyway, here's my PR: https://github.com/NixOS/nix/pull/4895 | 08:37:46 |
manveru | hm, i see, most other tests are ad-hoc shell scripts as well | 08:40:00 |
manveru | ok, got a working test now as well :) | 09:03:14 |
manveru | thanks a lot | 09:03:16 |
Regnat | niksnut Looking at the GC again, is it correct that Expr s are generally leaking? | 17:09:09 |
niksnut | It's by design | 17:09:51 |
niksnut | There is basically no point in GC'ing ASTs | 17:11:08 |
niksnut | Since they generally exist for the duration of the program | 17:11:30 |
Regnat | Oh, do they? I kind-of assumed that once a thunk is evaluated, the underlying AST isn’t used anymore (and is unreachable anyways) | 17:29:18 |