Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generated filenames depend on undefined behaviour - doxygen output not reproducible #8752

Closed
ellert opened this issue Sep 1, 2021 · 18 comments
Labels

Comments

@ellert
Copy link
Contributor

ellert commented Sep 1, 2021

When building documentation with doxygen 1.9.2 the filenames for the directory dependencies generated here:

relationName.sprintf("dir_%06d_%06d",dir->dirCount(),usedDir->dirCount());

are not reproducible. The dirCount() value depends on the order in which the files are scanned, which depends on the std::filesystem::directory_iterator. This order is not deterministic.

https://en.cppreference.com/w/cpp/filesystem/directory_iterator

says: "directory_iterator is a LegacyInputIterator that iterates over the directory_entry elements of a directory (but does not visit the subdirectories). The iteration order is unspecified, except that each directory entry is visited only once. The special pathnames dot and dot-dot are skipped."

Since the dirCount() values are not guaranteed to be constant between runs, they can not be used in the generated documentation or in the filenames used to save it, or the result is not-reproducible.

This causes problems when building packages for Fedora, since packages are built for multiple architectures, and the build system (koji) rejects builds where the set of filenames in a non-architecture dependent (noarch) package is different when built on different architectures.

Here is an example: https://koji.fedoraproject.org/koji/taskinfo?taskID=74850762

The build is rejected because:

BuildError: The following noarch package built differently on different architectures: root-doc-6.24.04-1.fc36.noarch.rpm
rpmdiff output was:
removed     /usr/share/doc/root/html/dir_000586_000029.html
removed     /usr/share/doc/root/html/dir_000586_000034.html
removed     /usr/share/doc/root/html/dir_000586_000043.html
removed     /usr/share/doc/root/html/dir_000586_000056.html
removed     /usr/share/doc/root/html/dir_000586_000063.html
removed     /usr/share/doc/root/html/dir_000586_000066.html
removed     /usr/share/doc/root/html/dir_000586_000075.html
removed     /usr/share/doc/root/html/dir_000586_000344.html
added       /usr/share/doc/root/html/dir_000587_000029.html
added       /usr/share/doc/root/html/dir_000587_000034.html
added       /usr/share/doc/root/html/dir_000587_000043.html
added       /usr/share/doc/root/html/dir_000587_000056.html
added       /usr/share/doc/root/html/dir_000587_000063.html
added       /usr/share/doc/root/html/dir_000587_000066.html
added       /usr/share/doc/root/html/dir_000587_000075.html
added       /usr/share/doc/root/html/dir_000587_000344.html
@ellert ellert changed the title Generated filenames depends on undefined behaviour - doxygen output not repoducible Generated filenames depend on undefined behaviour - doxygen output not reproducible Sep 1, 2021
@doxygen
Copy link
Owner

doxygen commented Sep 3, 2021

@ellert I haven't been able to reproduce this myself. Can you attach a self-contained example that shows the problem?

Regarding std::filesystem::directory_iterator, yes the order is not defined. This is why at

// Sort the FileDef objects by full path to get a predictable ordering over multiple runs
the input list is sorted. This list is later used to build the directory objects from
buildDirectories();

A simple example with some dummy files in dummy directories, shows that the order of searching is not defined:

Searching INPUT for files to process...
Searching for files in directory /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752
Searching for files in directory /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/d1
Searching for files in directory /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/z1
Searching for files in directory /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/d3
Searching for files in directory /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/d2
Searching for files in directory /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/a1

but then parsing the files and creating the directories uses the sorted list, so should be reproducable

Reading and parsing tag files
Parsing files
Preprocessing /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/a1/a1.h...
Parsing file /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/a1/a1.h...
Preprocessing /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/d1/d1.h...
Parsing file /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/d1/d1.h...
Preprocessing /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/d2/d2.h...
Parsing file /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/d2/d2.h...
Preprocessing /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/d3/d3.h...
Parsing file /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/d3/d3.h...
Preprocessing /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/z1/z1.h...
Parsing file /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/z1/z1.h...
Building macro definition list...
Building group list...
Building directory list...
** creating DirDef for /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/a1/ id=0
** creating DirDef for /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/d1/ id=1
** creating DirDef for /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/d2/ id=2
** creating DirDef for /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/d3/ id=3
** creating DirDef for /Users/dimitri/doxygen.dev/mail/1.9.2/issue8752/z1/ id=4
Building namespace list...

I've added the example I used to try to reproduce the issue:
issue8752_ok.zip

@doxygen doxygen added the needinfo reported bug is incomplete, please add additional info label Sep 3, 2021
@ellert
Copy link
Contributor Author

ellert commented Sep 10, 2021

Hi!

I added a debug statement to doxygen, at the place where the directories are assigned numbers (m_dirCount):

diff -ur doxygen-1.9.2.orig/src/dirdef.cpp doxygen-1.9.2/src/dirdef.cpp
--- doxygen-1.9.2.orig/src/dirdef.cpp	2021-08-17 19:10:43.000000000 +0200
+++ doxygen-1.9.2/src/dirdef.cpp	2021-09-03 18:36:13.936094000 +0200
@@ -133,6 +133,13 @@
   }
 
   m_dirCount   = g_dirCount++;
+
+  fprintf(stderr, "m_dirCount: %i\n %s\n %s\n %s\n",
+	  m_dirCount,
+	  path.data(),
+	  m_dispName.data(),
+	  m_shortName.data());
+
   m_level=-1;
   m_parent=0;
 }

These two files show the result of these outputs of two different architectures.

dir-x86_64.txt
dir-s390x.txt

The order between the two is similar, except that in one the directory roofit/roofitcore/src has number 501, and in the other 509 (with the intermediate directories shifted one position).

The m_dirCount of the directories then become part of the name of some generated files, which makes the set of files different.

Let me know if I can provide more information.

@albert-github
Copy link
Collaborator

The log files are a bit hard to read as they contain a lot of extra information, but after searching for m_dirCount I see the information.

I have seen that recently some changes were made regarding some order of processing in the master version (at first glance I thought for an unrelated topic though it might have an influence here as well, it is for the issue #8767 commit: 8ee3097).

  • Can you repeat your tests with the current master?
  • In respect to the mentioned debug statement can change the format to: "m_dirCount: %i %s %s %s\n" (makes it a bit more readable)

doxygen added a commit that referenced this issue Sep 12, 2021
@doxygen
Copy link
Owner

doxygen commented Sep 12, 2021

@ellert I haven't been able to really reproduce the problem, but I did make some changes to make the dirCount value more robust. It is now assigned based on the position in list of all directories after sorting. Please verify if the attached commit fixes the problem for you.

@albert-github
Copy link
Collaborator

Unfortunately a regression has been found:

Building macro definition list...
Building group list...
Building directory list...

Thread 1 "doxygen" received signal SIGSEGV, Segmentation fault.
operator()<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::unique_ptr<DirDef, std::default_delete<DirDef> > > (__closure=0xffffc608, d1=..., d2=...)
    at /cygdrive/d/Programs/Doxygen/Doxygen-.git/doxygen/src/dirdef.cpp:1056
1056                { int i1 = qstricmp(d1->shortName(),d2->shortName());
(gdb) where
#0  operator()<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::unique_ptr<DirDef, std::default_delete<DirDef> > > (__closure=0xffffc608, d1=..., d2=...)
    at /cygdrive/d/Programs/Doxygen/Doxygen-.git/doxygen/src/dirdef.cpp:1056
#1  0x000000010074bf79 in __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >::operator()<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >) (this=0xffffc608, __it1=..., __it2=...)
    at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/predefined_ops.h:158
#2  0x000000010074c0ca in std::__unguarded_partition<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=..., __pivot=..., __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1884
#3  0x000000010074b0c6 in std::__unguarded_partition_pivot<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=..., __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1906
#4  0x000000010074a9da in std::__introsort_loop<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long int, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=..., __depth_limit=16, __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1938
#5  0x000000010074a9fd in std::__introsort_loop<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long int, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=..., __depth_limit=17, __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1939
#6  0x000000010074a9fd in std::__introsort_loop<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long int, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=..., __depth_limit=18, __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1939
#7  0x000000010074a9fd in std::__introsort_loop<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long int, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=..., __depth_limit=19, __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1939
#8  0x000000010074a9fd in std::__introsort_loop<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long int, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef,--Type <RET> for more, q to quit, c to continue without paging--
 std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=..., __depth_limit=20, __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1939
#9  0x000000010074a9fd in std::__introsort_loop<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long int, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=..., __depth_limit=21, __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1939
#10 0x000000010074a66a in std::__sort<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=..., __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1954
#11 0x000000010074a48e in std::sort<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, buildDirectories()::<lambda(const auto:8&, const auto:9&)> >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, struct {...}) (__first=..., __last=..., __comp=...)
    at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:4875
#12 0x0000000100749ef7 in buildDirectories () at /cygdrive/d/Programs/Doxygen/Doxygen-.git/doxygen/src/dirdef.cpp:1053
#13 0x0000000100444742 in parseInput () at /cygdrive/d/Programs/Doxygen/Doxygen-.git/doxygen/src/doxygen.cpp:11800
#14 0x00000001004010b7 in main (argc=1, argv=0xffffcc40) at /cygdrive/d/Programs/Doxygen/Doxygen-.git/doxygen/src/main.cpp:37
(gdb)

All based on the moodle package processed by Fossies.

@doxygen
Copy link
Owner

doxygen commented Sep 12, 2021

@albert-github Ah, I see DirDef::shortName() was returning a reference, which when used as a temporary in qstricmp context causes undefined behavior (i.e. it worked for me but crashes for you). Can you verify if the problem is solved now?

@albert-github
Copy link
Collaborator

Unfortunately still:

Building group list...
Building directory list...

Thread 1 "doxygen" received signal SIGSEGV, Segmentation fault.
operator()<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::unique_ptr<DirDef, std::default_delete<DirDef> > > (__closure=0xffffc608, d1=..., d2=...)
    at /cygdrive/d/Programs/Doxygen/Doxygen-.git/doxygen/src/dirdef.cpp:1056
1056                { int i1 = qstricmp(d1->shortName(),d2->shortName());
(gdb) where
#0  operator()<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::unique_ptr<DirDef, std::default_delete<DirDef> > > (__closure=0xffffc608, d1=...,
    d2=...) at /cygdrive/d/Programs/Doxygen/Doxygen-.git/doxygen/src/dirdef.cpp:1056
#1  0x000000010074c21d in __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >::operator()<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >) (this=0xffffc608, __it1=..., __it2=...)
    at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/predefined_ops.h:158
#2  0x000000010074c36e in std::__unguarded_partition<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=..., __pivot=..., __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1884
#3  0x000000010074b31c in std::__unguarded_partition_pivot<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=..., __comp=...)
    at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1906
#4  0x000000010074ac30 in std::__introsort_loop<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long int, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=...,
    __depth_limit=16, __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1938
#5  0x000000010074ac53 in std::__introsort_loop<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long int, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=...,
    __depth_limit=17, __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1939
#6  0x000000010074ac53 in std::__introsort_loop<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long int, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_--Type <RET> for more, q to quit, c to continue without paging--
ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=...,
    __depth_limit=18, __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1939
#7  0x000000010074ac53 in std::__introsort_loop<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long int, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=...,
    __depth_limit=19, __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1939
#8  0x000000010074ac53 in std::__introsort_loop<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long int, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=...,
    __depth_limit=20, __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1939
#9  0x000000010074ac53 in std::__introsort_loop<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long int, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, long, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=...,
    __depth_limit=21, __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1939
#10 0x000000010074a8c0 in std::__sort<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> > >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__ops::_Iter_comp_iter<buildDirectories()::<lambda(const auto:8&, const auto:9&)> >) (__first=..., __last=..., __comp=...)
    at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:1954
#11 0x000000010074a6e4 in std::sort<__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, buildDirectories()::<lambda(const auto:8&, const auto:9&)> >(__gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<DirDef, std::default_delete<DirDef> >*, std::vector<std::unique_ptr<DirDef, std::default_delete<DirDef> >, std::allocator<std::unique_ptr<DirDef, std::default_delete<DirDef> > > > >, struct {...}) (__first=...,
    __last=..., __comp=...) at /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/stl_algo.h:4875
#12 0x000000010074a0f5 in buildDirectories () at /cygdrive/d/Programs/Doxygen/Doxygen-.git/doxygen/src/dirdef.cpp:1053
#13 0x0000000100444742 in parseInput () at /cygdrive/d/Programs/Doxygen/Doxygen-.git/doxygen/src/doxygen.cpp:11800
#14 0x00000001004010b7 in main (argc=1, argv=0xffffcc40) at /cygdrive/d/Programs/Doxygen/Doxygen-.git/doxygen/src/main.cpp:37
(gdb)

@doxygen
Copy link
Owner

doxygen commented Sep 12, 2021

@albert-github hmm, makes little sense to me. Did you do a clean build (or does it help if you do)? And if not, what are the values of d1->shortName().data() and d2->shortName().data() at the moment of the crash?

doxygen added a commit that referenced this issue Sep 12, 2021
@doxygen
Copy link
Owner

doxygen commented Sep 12, 2021

@albert-github I think I found the problem. The sorting logic was wrong. Please try again with the latest commit.

@albert-github
Copy link
Collaborator

@doxygen It looks like that the problem is solved now.

@ellert Please verify that the current master version solves your problem.

@ellert
Copy link
Contributor Author

ellert commented Sep 13, 2021

@ellert Please verify that the current master version solves your problem.

I can confirm that this solves the problem for me. (I did get a segfault with just the first commit though.)

@albert-github
Copy link
Collaborator

I assume that with just the first commit you mean commit 44e27fa and that with the master version including commit 0320654 everything works.

@albert-github albert-github added fixed but not released Bug is fixed in github, but still needs to make its way to an official release and removed needinfo reported bug is incomplete, please add additional info labels Sep 13, 2021
@ellert
Copy link
Contributor Author

ellert commented Sep 13, 2021

I assume that with just the first commit you mean commit 44e27fa and that with the master version including commit 0320654 everything works.

Correct.

@ngothan
Copy link
Contributor

ngothan commented Oct 26, 2021

it seems the problem is not yet completely solved. The problem still appears when building the libspf2 package for Fedora.

Here is an example: https://koji.fedoraproject.org/koji/taskinfo?taskID=77732452

The build is rejected because:

BuildError: The following noarch package built differently on different architectures: libspf2-apidocs-1.2.11-1.20210922git4915c308.fc36.noarch.rpm
rpmdiff output was:
removed     /usr/share/doc/libspf2-apidocs/html/a00004.map
removed     /usr/share/doc/libspf2-apidocs/html/a00004.md5
removed     /usr/share/doc/libspf2-apidocs/html/a00004.png
removed     /usr/share/doc/libspf2-apidocs/html/a00005_a5e8216fb634ea3e6dbe0d1436d956df1_cgraph.map
removed     /usr/share/doc/libspf2-apidocs/html/a00005_a5e8216fb634ea3e6dbe0d1436d956df1_cgraph.md5
removed     /usr/share/doc/libspf2-apidocs/html/a00005_a5e8216fb634ea3e6dbe0d1436d956df1_cgraph.png
removed     /usr/share/doc/libspf2-apidocs/html/a00005_a8208bf567458e9076a86d1f29687f82c_cgraph.map
removed     /usr/share/doc/libspf2-apidocs/html/a00005_a8208bf567458e9076a86d1f29687f82c_cgraph.md5
removed     /usr/share/doc/libspf2-apidocs/html/a00005_a8208bf567458e9076a86d1f29687f82c_cgraph.png
removed     /usr/share/doc/libspf2-apidocs/html/a00005_a8e81bbd9376ae621c51dc365c9fb9572_cgraph.map
removed     /usr/share/doc/libspf2-apidocs/html/a00005_a8e81bbd9376ae621c51dc365c9fb9572_cgraph.md5
removed     /usr/share/doc/libspf2-apidocs/html/a00005_a8e81bbd9376ae621c51dc365c9fb9572_cgraph.png
removed     /usr/share/doc/libspf2-apidocs/html/a00005_abec9d9eb3bf26c11e1cb12ba29bc8db0_cgraph.map
removed     /usr/share/doc/libspf2-apidocs/html/a00005_abec9d9eb3bf26c11e1cb12ba29bc8db0_cgraph.md5
removed     /usr/share/doc/libspf2-apidocs/html/a00005_abec9d9eb3bf26c11e1cb12ba29bc8db0_cgraph.png
removed     /usr/share/doc/libspf2-apidocs/html/a00007.map
removed     /usr/share/doc/libspf2-apidocs/html/a00007.md5
removed     /usr/share/doc/libspf2-apidocs/html/a00007.png
added       /usr/share/doc/libspf2-apidocs/html/a00009.map
added       /usr/share/doc/libspf2-apidocs/html/a00009.md5
added       /usr/share/doc/libspf2-apidocs/html/a00009.png

@albert-github
Copy link
Collaborator

@ngothan

  • which versions did you exactly compare
  • where can the source project be found? or better attach it to the issue as a self contained example (source+configuration file in a tar or zip)

@ngothan
Copy link
Contributor

ngothan commented Oct 26, 2021

i have used the lastest doxygen git version (57d3172)

I also attached the source+configuration file in a tar file
libspf2-doxygen.tar.gz

@albert-github
Copy link
Collaborator

albert-github commented Oct 26, 2021

which versions did you exactly compare

You mentioned the doxygen 1.9.3 (57d3172) version, but you said you compared but with what is it compared?

Forgot to mention in the previous comment:

  • Please always attach files (preferably compressed) to the issue and don't use links as links might not be persistent.

@doxygen
Copy link
Owner

doxygen commented Dec 31, 2021

This issue was previously marked 'fixed but not released',
which means it should be fixed in doxygen version 1.9.3.
Please verify if this is indeed the case. Reopen the
issue if you think it is not fixed and please include any additional information
that you think can be relevant (preferably in the form of a self-contained example).

@doxygen doxygen removed the fixed but not released Bug is fixed in github, but still needs to make its way to an official release label Dec 31, 2021
@doxygen doxygen closed this as completed Dec 31, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants