public inbox for libabigail@sourceware.org
 help / color / mirror / Atom feed
* [Bug default/28013] New: abidiff assertion failure
@ 2021-06-25 23:20 gprocida at google dot com
  2021-06-26  5:46 ` [Bug default/28013] " gprocida at google dot com
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: gprocida at google dot com @ 2021-06-25 23:20 UTC (permalink / raw)
  To: libabigail

https://sourceware.org/bugzilla/show_bug.cgi?id=28013

            Bug ID: 28013
           Summary: abidiff assertion failure
           Product: libabigail
           Version: unspecified
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: default
          Assignee: dodji at redhat dot com
          Reporter: gprocida at google dot com
                CC: libabigail at sourceware dot org
  Target Milestone: ---

This small case triggers an assertion failure. If assertions are disabled the
output looks sane.

abidiff: ../../src/abg-ir.cc:24767: size_t
abigail::ir::hash_as_canonical_type_or_constant(const abigail::ir::type_base*):
Assertion `__abg_cond__' failed.
Aborted

==> fn_variadic_c.0.abi <==
<abi-corpus version='2.0' path='fn_variadic_c.0.o'
architecture='elf-amd-x86_64'>
  <elf-function-symbols>
    <elf-symbol name='foo1' type='func-type' binding='global-binding'
visibility='default-visibility' is-defined='yes'/>
    <elf-symbol name='foo2' type='func-type' binding='global-binding'
visibility='default-visibility' is-defined='yes'/>
    <elf-symbol name='foo3' type='func-type' binding='global-binding'
visibility='default-visibility' is-defined='yes'/>
  </elf-function-symbols>
  <abi-instr address-size='64' path='fn_variadic_c.0.c' language='LANG_C99'>
    <type-decl name='int' size-in-bits='32' id='95e97e5e'/>
    <type-decl name='variadic parameter type' id='2c1145c5'/>
    <function-decl name='foo3' mangled-name='foo3' visibility='default'
binding='global' size-in-bits='64' elf-symbol-id='foo3'>
      <parameter type-id='95e97e5e' name='x'/>
      <parameter type-id='95e97e5e' name='y'/>
      <parameter is-variadic='yes'/>
      <return type-id='95e97e5e'/>
    </function-decl>
    <function-decl name='foo2' mangled-name='foo2' visibility='default'
binding='global' size-in-bits='64' elf-symbol-id='foo2'>
      <parameter type-id='95e97e5e' name='x'/>
      <parameter type-id='95e97e5e' name='y'/>
      <return type-id='95e97e5e'/>
    </function-decl>
    <function-decl name='foo1' mangled-name='foo1' visibility='default'
binding='global' size-in-bits='64' elf-symbol-id='foo1'>
      <parameter type-id='95e97e5e' name='x'/>
      <parameter type-id='95e97e5e' name='y'/>
      <return type-id='95e97e5e'/>
    </function-decl>
  </abi-instr>
</abi-corpus>

==> fn_variadic_c.1.abi <==
<abi-corpus version='2.0' path='fn_variadic_c.1.o'
architecture='elf-amd-x86_64'>
  <elf-function-symbols>
    <elf-symbol name='foo1' type='func-type' binding='global-binding'
visibility='default-visibility' is-defined='yes'/>
    <elf-symbol name='foo2' type='func-type' binding='global-binding'
visibility='default-visibility' is-defined='yes'/>
    <elf-symbol name='foo3' type='func-type' binding='global-binding'
visibility='default-visibility' is-defined='yes'/>
  </elf-function-symbols>
  <abi-instr address-size='64' path='fn_variadic_c.1.c' language='LANG_C99'>
    <type-decl name='int' size-in-bits='32' id='95e97e5e'/>
    <type-decl name='variadic parameter type' id='2c1145c5'/>
    <function-decl name='foo3' mangled-name='foo3' visibility='default'
binding='global' size-in-bits='64' elf-symbol-id='foo3'>
      <parameter type-id='95e97e5e' name='x'/>
      <parameter type-id='95e97e5e' name='y'/>
      <return type-id='95e97e5e'/>
    </function-decl>
    <function-decl name='foo2' mangled-name='foo2' visibility='default'
binding='global' size-in-bits='64' elf-symbol-id='foo2'>
      <parameter type-id='95e97e5e' name='x'/>
      <parameter is-variadic='yes'/>
      <return type-id='95e97e5e'/>
    </function-decl>
    <function-decl name='foo1' mangled-name='foo1' visibility='default'
binding='global' size-in-bits='64' elf-symbol-id='foo1'>
      <parameter type-id='95e97e5e' name='x'/>
      <parameter type-id='95e97e5e' name='y'/>
      <parameter is-variadic='yes'/>
      <return type-id='95e97e5e'/>
    </function-decl>
  </abi-instr>
</abi-corpus>

It's also interesting that the XML contains a variadic parameter type but this
isn't used in the parameter lists.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug default/28013] abidiff assertion failure
  2021-06-25 23:20 [Bug default/28013] New: abidiff assertion failure gprocida at google dot com
@ 2021-06-26  5:46 ` gprocida at google dot com
  2021-07-14  8:52 ` gprocida at google dot com
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: gprocida at google dot com @ 2021-06-26  5:46 UTC (permalink / raw)
  To: libabigail

https://sourceware.org/bugzilla/show_bug.cgi?id=28013

--- Comment #1 from gprocida at google dot com ---
Here's a minimal test case.

$ head fn_variadic_c.{0,1}.c; for i in 0 1; do gcc -Wall -Wextra -g -c
fn_variadic_c.$i.c; ~/android/libabigail/build/tools/abidw fn_variadic_c.$i.o >
fn_variadic_c.$i.abi; done; head -50 fn_variadic_c.{0,1}.abi;
~/android/libabigail/build/tools/abidiff fn_variadic_c.{0,1}.abi
==> fn_variadic_c.0.c <==
int foo(int x, int y) { return x + y; }

==> fn_variadic_c.1.c <==
int foo(int x, ...) { return x; }
==> fn_variadic_c.0.abi <==
<abi-corpus version='2.0' path='fn_variadic_c.0.o'
architecture='elf-amd-x86_64'>
  <elf-function-symbols>
    <elf-symbol name='foo' type='func-type' binding='global-binding'
visibility='default-visibility' is-defined='yes'/>
  </elf-function-symbols>
  <abi-instr address-size='64' path='fn_variadic_c.0.c' comp-dir-path='/tmp'
language='LANG_C99'>
    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
    <function-decl name='foo' mangled-name='foo'
filepath='/tmp/fn_variadic_c.0.c' line='1' column='1' visibility='default'
binding='global' size-in-bits='64' elf-symbol-id='foo'>
      <parameter type-id='type-id-1' name='x' filepath='/tmp/fn_variadic_c.0.c'
line='1' column='1'/>
      <parameter type-id='type-id-1' name='y' filepath='/tmp/fn_variadic_c.0.c'
line='1' column='1'/>
      <return type-id='type-id-1'/>
    </function-decl>
  </abi-instr>
</abi-corpus>

==> fn_variadic_c.1.abi <==
<abi-corpus version='2.0' path='fn_variadic_c.1.o'
architecture='elf-amd-x86_64'>
  <elf-function-symbols>
    <elf-symbol name='foo' type='func-type' binding='global-binding'
visibility='default-visibility' is-defined='yes'/>
  </elf-function-symbols>
  <abi-instr address-size='64' path='fn_variadic_c.1.c' comp-dir-path='/tmp'
language='LANG_C99'>
    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
    <type-decl name='variadic parameter type' id='type-id-2'/>
    <function-decl name='foo' mangled-name='foo'
filepath='/tmp/fn_variadic_c.1.c' line='1' column='1' visibility='default'
binding='global' size-in-bits='64' elf-symbol-id='foo'>
      <parameter type-id='type-id-1' name='x' filepath='/tmp/fn_variadic_c.1.c'
line='1' column='1'/>
      <parameter is-variadic='yes'/>
      <return type-id='type-id-1'/>
    </function-decl>
  </abi-instr>
</abi-corpus>
abidiff: ../../src/abg-ir.cc:24767: size_t
abigail::ir::hash_as_canonical_type_or_constant(const abigail::ir::type_base*):
Assertion `__abg_cond__' failed.
Aborted

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug default/28013] abidiff assertion failure
  2021-06-25 23:20 [Bug default/28013] New: abidiff assertion failure gprocida at google dot com
  2021-06-26  5:46 ` [Bug default/28013] " gprocida at google dot com
@ 2021-07-14  8:52 ` gprocida at google dot com
  2021-08-12 22:14 ` gprocida at google dot com
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: gprocida at google dot com @ 2021-07-14  8:52 UTC (permalink / raw)
  To: libabigail

https://sourceware.org/bugzilla/show_bug.cgi?id=28013

--- Comment #2 from gprocida at google dot com ---
Looks like it might be a canonicalisation issue with variadic function
parameters.

#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007ffff798d537 in __GI_abort () at abort.c:79
#2  0x00007ffff798d40f in __assert_fail_base (fmt=0x7ffff7af6128 "%s%s%s:%u:
%s%sAssertion `%s' failed.\n%n", assertion=0x55555575e725 "__abg_cond__",
file=0x55555575e711 "../../src/abg-ir.cc", line=24781, function=<optimized
out>) at assert.c:92
#3  0x00007ffff799c662 in __GI___assert_fail
(assertion=assertion@entry=0x55555575e725 "__abg_cond__",
file=file@entry=0x55555575e711 "../../src/abg-ir.cc", line=line@entry=24781, 
    function=function@entry=0x55555575f0e0 "size_t
abigail::ir::hash_as_canonical_type_or_constant(const
abigail::ir::type_base*)") at assert.c:101
#4  0x0000555555587888 in abigail::ir::hash_as_canonical_type_or_constant
(t=0x5555558358e0) at ../../src/abg-ir.cc:24781
#5  0x000055555558c783 in abigail::ir::hash_type (t=<optimized out>) at
../../src/abg-ir.cc:24728
#6  0x000055555559dd01 in abigail::ir::hash_type_or_decl (tod=0x5555558358b8)
at ../../src/abg-ir.cc:24655
#7  0x000055555559e22b in abigail::ir::hash_type_or_decl
(tod=std::shared_ptr<class abigail::ir::type_or_decl_base> (use count 13, weak
count 1) = {...}) at /usr/include/c++/10/bits/shared_ptr_base.h:1324
#8  0x000055555563f7f0 in abigail::comparison::types_or_decls_hash::operator()
(d={...}, this=0x55555581f838) at ../../src/abg-comparison-priv.h:61
#9 
std::__detail::_Hash_code_base<std::pair<std::shared_ptr<abigail::ir::type_or_decl_base>
const, std::shared_ptr<abigail::ir::type_or_decl_base> const>,
std::pair<std::pair<std::shared_ptr<abigail::ir::type_or_decl_base> const,
std::shared_ptr<abigail::ir::type_or_decl_base> con
st> const, std::shared_ptr<abigail::comparison::diff> >,
std::__detail::_Select1st, abigail::comparison::types_or_decls_hash,
std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash,
true>::_M_hash_code (__k={...}, this=0x55555581f838)
    at /usr/include/c++/10/bits/hashtable_policy.h:1379
#10 std::_Hashtable<std::pair<std::shared_ptr<abigail::ir::type_or_decl_base>
const, std::shared_ptr<abigail::ir::type_or_decl_base> const>,
std::pair<std::pair<std::shared_ptr<abigail::ir::type_or_decl_base> const,
std::shared_ptr<abigail::ir::type_or_decl_base> const> const, std:
:shared_ptr<abigail::comparison::diff> >,
std::allocator<std::pair<std::pair<std::shared_ptr<abigail::ir::type_or_decl_base>
const, std::shared_ptr<abigail::ir::type_or_decl_base> const> const,
std::shared_ptr<abigail::comparison::diff> > >, std::__detail::_Select1st,
abigail::comp
arison::types_or_decls_equal, abigail::comparison::types_or_decls_hash,
std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash,
std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true,
false, true> >::find (this=0x55555581f838, __k={...})
    at /usr/include/c++/10/bits/hashtable.h:1452
#11 0x0000555555613829 in
std::unordered_map<std::pair<std::shared_ptr<abigail::ir::type_or_decl_base>
const, std::shared_ptr<abigail::ir::type_or_decl_base> const>,
std::shared_ptr<abigail::comparison::diff>,
abigail::comparison::types_or_decls_hash, abigail::comparison::types_or_
decls_equal,
std::allocator<std::pair<std::pair<std::shared_ptr<abigail::ir::type_or_decl_base>
const, std::shared_ptr<abigail::ir::type_or_decl_base> const> const,
std::shared_ptr<abigail::comparison::diff> > > >::find (__x={...},
this=<optimized out>)
    at /usr/include/c++/10/bits/unordered_map.h:919
#12 abigail::comparison::diff_context::has_diff_for (this=<optimized out>,
first=std::shared_ptr<class abigail::ir::type_or_decl_base> (use count 17, weak
count 8) = {...}, second=std::shared_ptr<class abigail::ir::type_or_decl_base>
(use count 13, weak count 1) = {...})
    at ../../src/abg-comparison.cc:993
#13 0x0000555555613cf9 in
abigail::comparison::diff_context::get_canonical_diff_for
(this=this@entry=0x5555558037f0, first=std::shared_ptr<class
abigail::ir::type_or_decl_base> (use count 17, weak count 8) = {...}, 
    second=std::shared_ptr<class abigail::ir::type_or_decl_base> (use count 13,
weak count 1) = {...}) at /usr/include/c++/10/ext/atomicity.h:100
#14 0x000055555561a992 in
abigail::comparison::diff_context::set_or_get_canonical_diff_for
(this=this@entry=0x5555558037f0, first=std::shared_ptr<class
abigail::ir::type_or_decl_base> (use count 17, weak count 8) = {...}, 
    second=std::shared_ptr<class abigail::ir::type_or_decl_base> (use count 13,
weak count 1) = {...}, canonical_diff=std::shared_ptr<class
abigail::comparison::diff> (use count 3, weak count 0) = {...}) at
/usr/include/c++/10/ext/atomicity.h:100
#15 0x000055555561abd8 in
abigail::comparison::diff_context::initialize_canonical_diff
(this=0x5555558037f0, diff=std::shared_ptr<class abigail::comparison::diff>
(use count 3, weak count 0) = {...}) at
/usr/include/c++/10/bits/shared_ptr_base.h:1324
#16 0x000055555561b557 in abigail::comparison::compute_diff
(first=std::shared_ptr<class abigail::ir::type_decl> (use count 17, weak count
8) = {...}, second=std::shared_ptr<class abigail::ir::type_decl> (use count 13,
weak count 1) = {...}, 
    ctxt=std::shared_ptr<class abigail::comparison::diff_context> (use count
10, weak count 5) = {...}) at /usr/include/c++/10/ext/atomicity.h:100
#17 0x000055555565ae29 in
abigail::comparison::try_to_diff<abigail::ir::type_decl>
(first=std::shared_ptr<class abigail::ir::type_or_decl_base> (use count 17,
weak count 8) = {...}, second=std::shared_ptr<class
abigail::ir::type_or_decl_base> (use count 13, weak count 1) = {...}, 
    ctxt=std::shared_ptr<class abigail::comparison::diff_context> (use count
10, weak count 5) = {...}) at /usr/include/c++/10/ext/atomicity.h:100
#18 0x0000555555626b44 in abigail::comparison::compute_diff_for_types
(first=std::shared_ptr<class abigail::ir::type_or_decl_base> (use count 17,
weak count 8) = {...}, second=std::shared_ptr<class
abigail::ir::type_or_decl_base> (use count 13, weak count 1) = {...}, 
    ctxt=std::shared_ptr<class abigail::comparison::diff_context> (use count
10, weak count 5) = {...}) at /usr/include/c++/10/bits/shared_ptr_base.h:736
#19 0x000055555562e9ad in abigail::comparison::compute_diff
(first=std::shared_ptr<class abigail::ir::type_base> (use count 17, weak count
8) = {...}, second=std::shared_ptr<class abigail::ir::type_base> (use count 13,
weak count 1) = {...}, 
    ctxt=std::shared_ptr<class abigail::comparison::diff_context> (use count
10, weak count 5) = {...}) at /usr/include/c++/10/ext/atomicity.h:100
#20 0x000055555562f26a in abigail::comparison::fn_parm_diff::fn_parm_diff
(this=0x55555582a0c0, first=std::shared_ptr<class
abigail::ir::function_decl::parameter> (use count 6, weak count 0) = {...}, 
    second=std::shared_ptr<class abigail::ir::function_decl::parameter> (use
count 5, weak count 0) = {...}, ctxt=std::shared_ptr<class
abigail::comparison::diff_context> (use count 10, weak count 5) = {...}) at
/usr/include/c++/10/bits/shared_ptr_base.h:1324
#21 0x000055555562f51d in abigail::comparison::compute_diff
(first=std::shared_ptr<class abigail::ir::function_decl::parameter> (use count
6, weak count 0) = {...}, second=std::shared_ptr<class
abigail::ir::function_decl::parameter> (use count 5, weak count 0) = {...}, 
    ctxt=std::shared_ptr<class abigail::comparison::diff_context> (use count
10, weak count 5) = {...}) at /usr/include/c++/10/ext/atomicity.h:97
#22 0x000055555562fe4e in
abigail::comparison::function_type_diff::ensure_lookup_tables_populated
(this=this@entry=0x55555581f9a0) at /usr/include/c++/10/ext/atomicity.h:100
#23 0x0000555555622928 in abigail::comparison::compute_diff
(first=std::shared_ptr<class abigail::ir::function_type> (use count 4, weak
count 3) = {...}, second=std::shared_ptr<class abigail::ir::function_type> (use
count 4, weak count 3) = {...}, 
    ctxt=std::shared_ptr<class abigail::comparison::diff_context> (use count
10, weak count 5) = {...}) at /usr/include/c++/10/bits/shared_ptr_base.h:1324
#24 0x0000555555622ae2 in abigail::comparison::compute_diff
(first=std::shared_ptr<class abigail::ir::function_decl> (use count 2, weak
count 0) = {...}, second=std::shared_ptr<class abigail::ir::function_decl> (use
count 2, weak count 0) = {...}, 
    ctxt=std::shared_ptr<class abigail::comparison::diff_context> (use count
10, weak count 5) = {...}) at /usr/include/c++/10/bits/shared_ptr_base.h:1324
#25 0x000055555563321f in
abigail::comparison::corpus_diff::priv::ensure_lookup_tables_populated
(this=0x55555582c470) at /usr/include/c++/10/ext/atomicity.h:100
#26 0x00005555556356c4 in abigail::comparison::compute_diff
(f=std::shared_ptr<class abigail::ir::corpus> (use count 3, weak count 0) =
{...}, s=..., ctxt=...) at /usr/include/c++/10/bits/shared_ptr_base.h:1324
#27 0x000055555557df82 in main (argc=<optimized out>, argv=0x7fffffffd7a8) at
/usr/include/c++/10/bits/shared_ptr_base.h:736


I'm going to leave this one to Dodji.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug default/28013] abidiff assertion failure
  2021-06-25 23:20 [Bug default/28013] New: abidiff assertion failure gprocida at google dot com
  2021-06-26  5:46 ` [Bug default/28013] " gprocida at google dot com
  2021-07-14  8:52 ` gprocida at google dot com
@ 2021-08-12 22:14 ` gprocida at google dot com
  2022-01-14 16:10 ` gprocida at google dot com
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: gprocida at google dot com @ 2021-08-12 22:14 UTC (permalink / raw)
  To: libabigail

https://sourceware.org/bugzilla/show_bug.cgi?id=28013

--- Comment #3 from gprocida at google dot com ---
This appears to be fixed with current upstream master.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug default/28013] abidiff assertion failure
  2021-06-25 23:20 [Bug default/28013] New: abidiff assertion failure gprocida at google dot com
                   ` (2 preceding siblings ...)
  2021-08-12 22:14 ` gprocida at google dot com
@ 2022-01-14 16:10 ` gprocida at google dot com
  2022-03-07  9:42 ` dodji at redhat dot com
  2022-03-07 11:07 ` dodji at redhat dot com
  5 siblings, 0 replies; 7+ messages in thread
From: gprocida at google dot com @ 2022-01-14 16:10 UTC (permalink / raw)
  To: libabigail

https://sourceware.org/bugzilla/show_bug.cgi?id=28013

--- Comment #4 from gprocida at google dot com ---
This is again an issue, at 71633a7c0c7c96c03db8c18826afea26da0f7b4b.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug default/28013] abidiff assertion failure
  2021-06-25 23:20 [Bug default/28013] New: abidiff assertion failure gprocida at google dot com
                   ` (3 preceding siblings ...)
  2022-01-14 16:10 ` gprocida at google dot com
@ 2022-03-07  9:42 ` dodji at redhat dot com
  2022-03-07 11:07 ` dodji at redhat dot com
  5 siblings, 0 replies; 7+ messages in thread
From: dodji at redhat dot com @ 2022-03-07  9:42 UTC (permalink / raw)
  To: libabigail

https://sourceware.org/bugzilla/show_bug.cgi?id=28013

dodji at redhat dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2022-03-07
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |ASSIGNED

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug default/28013] abidiff assertion failure
  2021-06-25 23:20 [Bug default/28013] New: abidiff assertion failure gprocida at google dot com
                   ` (4 preceding siblings ...)
  2022-03-07  9:42 ` dodji at redhat dot com
@ 2022-03-07 11:07 ` dodji at redhat dot com
  5 siblings, 0 replies; 7+ messages in thread
From: dodji at redhat dot com @ 2022-03-07 11:07 UTC (permalink / raw)
  To: libabigail

https://sourceware.org/bugzilla/show_bug.cgi?id=28013

dodji at redhat dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
         Resolution|---                         |FIXED

--- Comment #5 from dodji at redhat dot com ---
This should be fixed by the patch below, applied to master.  Thanks.

https://sourceware.org/pipermail/libabigail/2022q1/004207.html

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-03-07 11:07 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-25 23:20 [Bug default/28013] New: abidiff assertion failure gprocida at google dot com
2021-06-26  5:46 ` [Bug default/28013] " gprocida at google dot com
2021-07-14  8:52 ` gprocida at google dot com
2021-08-12 22:14 ` gprocida at google dot com
2022-01-14 16:10 ` gprocida at google dot com
2022-03-07  9:42 ` dodji at redhat dot com
2022-03-07 11:07 ` dodji at redhat dot com

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).