[{"id":33095,"web_url":"https://patchwork.libcamera.org/comment/33095/","msgid":"<x7u5svqbaxiazys4spoofohnuhwplvjilsdebshhrbfitlweof@y57tcjbsltic>","date":"2025-01-20T08:10:41","subject":"Re: [PATCH] libcamera: v4l2_subdevice: Work around false positive\n\twarning","submitter":{"id":184,"url":"https://patchwork.libcamera.org/api/people/184/","name":"Stefan Klug","email":"stefan.klug@ideasonboard.com"},"content":"Hi Laurent,\n\nThank you for the patch. \n\nOn Tue, Jan 14, 2025 at 04:36:22PM +0200, Laurent Pinchart wrote:\n> gcc 13.3.0, as provided by buildroot 2024.11.1, chokes when compiling\n> v4l2_subdevice.cpp with ASan enabled, due to the usage of the C++\n> standard library regex header:\n> \n> In file included from /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/functional:59,\n>                  from ../../include/libcamera/base/utils.h:12,\n>                  from ../../include/libcamera/base/log.h:15,\n>                  from ../../include/libcamera/internal/v4l2_subdevice.h:20,\n>                  from ../../src/libcamera/v4l2_subdevice.cpp:8:\n> In constructor ‘std::function<_Res(_ArgTypes ...)>::function(std::function<_Res(_ArgTypes ...)>&&) [with _Res = bool; _ArgTypes = {char}]’,\n>     inlined from ‘std::__detail::_State<_Char_type>::_State(std::__detail::_State<_Char_type>&&) [with _Char_type = char]’ at /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h:149:4,\n>     inlined from ‘std::__detail::_StateIdT std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_begin() [with _TraitsT = std::__cxx11::regex_traits<char>]’ at /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h:281:24:\n> /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/std_function.h:405:42: error: ‘*(std::function<bool(char)>*)((char*)&__tmp + offsetof(std::__detail::_StateT, std::__detail::_State<char>::<unnamed>.std::__detail::_State_base::<unnamed>)).std::function<bool(char)>::_M_invoker’ may be used uninitialized [-Werror=maybe-uninitialized]\n>   405 |       : _Function_base(), _M_invoker(__x._M_invoker)\n>       |                                      ~~~~^~~~~~~~~~\n> In file included from /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/regex:65,\n>                  from ../../src/libcamera/v4l2_subdevice.cpp:11:\n> /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h: In member function ‘std::__detail::_StateIdT std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_begin() [with _TraitsT = std::__cxx11::regex_traits<char>]’:\n> /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h:279:17: note: ‘__tmp’ declared here\n>   279 |         _StateT __tmp(_S_opcode_subexpr_begin);\n>       |                 ^~~~~\n> In member function ‘bool std::_Function_base::_M_empty() const’,\n>     inlined from ‘std::function<_Res(_ArgTypes ...)>::operator bool() const [with _Res = bool; _ArgTypes = {char}]’ at /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/std_function.h:574:25,\n>     inlined from ‘std::function<_Res(_ArgTypes ...)>::function(std::function<_Res(_ArgTypes ...)>&&) [with _Res = bool; _ArgTypes = {char}]’ at /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/std_function.h:407:6,\n>     inlined from ‘std::__detail::_State<_Char_type>::_State(std::__detail::_State<_Char_type>&&) [with _Char_type = char]’ at /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h:149:4,\n>     inlined from ‘std::__detail::_StateIdT std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_begin() [with _TraitsT = std::__cxx11::regex_traits<char>]’ at /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h:281:24:\n> /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/std_function.h:247:37: error: ‘*(const std::_Function_base*)((char*)&__tmp + offsetof(std::__detail::_StateT, std::__detail::_State<char>::<unnamed>.std::__detail::_State_base::<unnamed>)).std::_Function_base::_M_manager’ may be used uninitialized [-Werror=maybe-uninitialized]\n>   247 |     bool _M_empty() const { return !_M_manager; }\n>       |                                     ^~~~~~~~~~\n> /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h: In member function ‘std::__detail::_StateIdT std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_begin() [with _TraitsT = std::__cxx11:\n> /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h:279:17: note: ‘__tmp’ declared here\n>   279 |         _StateT __tmp(_S_opcode_subexpr_begin);\n>       |                 ^~~~~\n> \n> This is a false positive that previously occurred with gcc 12.1.0 and\n> was fixed in 12.2 (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105562),\n> and it seems to have now reappeared. The bug report indicates that the\n> probability of such false positives increase when using sanitizers. As\n> this isn't caught by CI, which compiles libcamera with gcc 13.3.0, the\n> chance that such compilation failures will appear in environments\n> without a clear pattern is relatively high. Work around the problem by\n> disabling the warning around the inclusiong of the regex header.\n> \n> If the regex header needs to be included in other source files, creating\n> a wrapped in libcamera-base may be a cleaner alternative.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nLooking at the bug report (especially\nhttps://gcc.gnu.org/bugzilla/show_bug.cgi?id=105562#c29 ) it might be\nsensible to disable -Werror globally when using sanitizers. Let's see\nhow often it pops up.\n\nReviewed-by: Stefan Klug <stefan.klug@ideasonboard.com> \n\nCheers,\nStefan\n\n> ---\n>  src/libcamera/v4l2_subdevice.cpp | 8 +++++++-\n>  1 file changed, 7 insertions(+), 1 deletion(-)\n> \n> diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp\n> index 7a064d87da41..33279654db8c 100644\n> --- a/src/libcamera/v4l2_subdevice.cpp\n> +++ b/src/libcamera/v4l2_subdevice.cpp\n> @@ -8,12 +8,18 @@\n>  #include \"libcamera/internal/v4l2_subdevice.h\"\n>  \n>  #include <fcntl.h>\n> -#include <regex>\n>  #include <sstream>\n>  #include <string.h>\n>  #include <sys/ioctl.h>\n>  #include <unistd.h>\n>  \n> +#pragma GCC diagnostic push\n> +#if defined __SANITIZE_ADDRESS__ && defined __OPTIMIZE__\n> +#pragma GCC diagnostic ignored \"-Wmaybe-uninitialized\"\n> +#endif\n> +#include <regex>\n> +#pragma GCC diagnostic pop\n> +\n>  #include <linux/media-bus-format.h>\n>  #include <linux/v4l2-subdev.h>\n>  \n> \n> base-commit: 2ae7b2ff7438a4deecff2a8b5de685cc14e5cd44\n> -- \n> Regards,\n> \n> Laurent Pinchart\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id D5550C327D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 20 Jan 2025 08:10:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8AD946854A;\n\tMon, 20 Jan 2025 09:10:45 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B911068503\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 20 Jan 2025 09:10:43 +0100 (CET)","from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:4375:4b53:c7c1:47a6])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2FEEE735;\n\tMon, 20 Jan 2025 09:09:42 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"XtTPzS4M\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1737360582;\n\tbh=u7he+kJsBNbIJuAhvVH3TZ+TaCUup8Z9cdlrVCln5jc=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=XtTPzS4MTFC7id+5UNTtKE1x4opjVX0oaHMYsQvcROxFSst6bofmXio5hmfSeE+QQ\n\tDfoyyy9pw4IYCLkB/RKE5FWQCgTMSwH0FGGuY5HTMUmeIUvMy1z21vpVOynF+5mIaV\n\tiZNN56Uizk4G45rSZ+Al0O+DAInPUradWwJ4GPy0=","Date":"Mon, 20 Jan 2025 09:10:41 +0100","From":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH] libcamera: v4l2_subdevice: Work around false positive\n\twarning","Message-ID":"<x7u5svqbaxiazys4spoofohnuhwplvjilsdebshhrbfitlweof@y57tcjbsltic>","References":"<20250114143622.28803-1-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20250114143622.28803-1-laurent.pinchart@ideasonboard.com>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":33096,"web_url":"https://patchwork.libcamera.org/comment/33096/","msgid":"<20250120083032.GA12716@pendragon.ideasonboard.com>","date":"2025-01-20T08:30:32","subject":"Re: [PATCH] libcamera: v4l2_subdevice: Work around false positive\n\twarning","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Mon, Jan 20, 2025 at 09:10:41AM +0100, Stefan Klug wrote:\n> Hi Laurent,\n> \n> Thank you for the patch. \n> \n> On Tue, Jan 14, 2025 at 04:36:22PM +0200, Laurent Pinchart wrote:\n> > gcc 13.3.0, as provided by buildroot 2024.11.1, chokes when compiling\n> > v4l2_subdevice.cpp with ASan enabled, due to the usage of the C++\n> > standard library regex header:\n> > \n> > In file included from /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/functional:59,\n> >                  from ../../include/libcamera/base/utils.h:12,\n> >                  from ../../include/libcamera/base/log.h:15,\n> >                  from ../../include/libcamera/internal/v4l2_subdevice.h:20,\n> >                  from ../../src/libcamera/v4l2_subdevice.cpp:8:\n> > In constructor ‘std::function<_Res(_ArgTypes ...)>::function(std::function<_Res(_ArgTypes ...)>&&) [with _Res = bool; _ArgTypes = {char}]’,\n> >     inlined from ‘std::__detail::_State<_Char_type>::_State(std::__detail::_State<_Char_type>&&) [with _Char_type = char]’ at /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h:149:4,\n> >     inlined from ‘std::__detail::_StateIdT std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_begin() [with _TraitsT = std::__cxx11::regex_traits<char>]’ at /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h:281:24:\n> > /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/std_function.h:405:42: error: ‘*(std::function<bool(char)>*)((char*)&__tmp + offsetof(std::__detail::_StateT, std::__detail::_State<char>::<unnamed>.std::__detail::_State_base::<unnamed>)).std::function<bool(char)>::_M_invoker’ may be used uninitialized [-Werror=maybe-uninitialized]\n> >   405 |       : _Function_base(), _M_invoker(__x._M_invoker)\n> >       |                                      ~~~~^~~~~~~~~~\n> > In file included from /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/regex:65,\n> >                  from ../../src/libcamera/v4l2_subdevice.cpp:11:\n> > /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h: In member function ‘std::__detail::_StateIdT std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_begin() [with _TraitsT = std::__cxx11::regex_traits<char>]’:\n> > /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h:279:17: note: ‘__tmp’ declared here\n> >   279 |         _StateT __tmp(_S_opcode_subexpr_begin);\n> >       |                 ^~~~~\n> > In member function ‘bool std::_Function_base::_M_empty() const’,\n> >     inlined from ‘std::function<_Res(_ArgTypes ...)>::operator bool() const [with _Res = bool; _ArgTypes = {char}]’ at /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/std_function.h:574:25,\n> >     inlined from ‘std::function<_Res(_ArgTypes ...)>::function(std::function<_Res(_ArgTypes ...)>&&) [with _Res = bool; _ArgTypes = {char}]’ at /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/std_function.h:407:6,\n> >     inlined from ‘std::__detail::_State<_Char_type>::_State(std::__detail::_State<_Char_type>&&) [with _Char_type = char]’ at /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h:149:4,\n> >     inlined from ‘std::__detail::_StateIdT std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_begin() [with _TraitsT = std::__cxx11::regex_traits<char>]’ at /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h:281:24:\n> > /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/std_function.h:247:37: error: ‘*(const std::_Function_base*)((char*)&__tmp + offsetof(std::__detail::_StateT, std::__detail::_State<char>::<unnamed>.std::__detail::_State_base::<unnamed>)).std::_Function_base::_M_manager’ may be used uninitialized [-Werror=maybe-uninitialized]\n> >   247 |     bool _M_empty() const { return !_M_manager; }\n> >       |                                     ^~~~~~~~~~\n> > /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h: In member function ‘std::__detail::_StateIdT std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_begin() [with _TraitsT = std::__cxx11:\n> > /host/aarch64-buildroot-linux-gnu/include/c++/13.3.0/bits/regex_automaton.h:279:17: note: ‘__tmp’ declared here\n> >   279 |         _StateT __tmp(_S_opcode_subexpr_begin);\n> >       |                 ^~~~~\n> > \n> > This is a false positive that previously occurred with gcc 12.1.0 and\n> > was fixed in 12.2 (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105562),\n> > and it seems to have now reappeared. The bug report indicates that the\n> > probability of such false positives increase when using sanitizers. As\n> > this isn't caught by CI, which compiles libcamera with gcc 13.3.0, the\n> > chance that such compilation failures will appear in environments\n> > without a clear pattern is relatively high. Work around the problem by\n> > disabling the warning around the inclusiong of the regex header.\n> > \n> > If the regex header needs to be included in other source files, creating\n> > a wrapped in libcamera-base may be a cleaner alternative.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> Looking at the bug report (especially\n> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105562#c29 ) it might be\n> sensible to disable -Werror globally when using sanitizers. Let's see\n> how often it pops up.\n\nI'd like to avoid that as much as possible. Enabling ASan increases\nbuild test coverage in CI. If we disable -Werror, we can as well disable\nASan in build tests.\n\n> Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com> \n> \n> > ---\n> >  src/libcamera/v4l2_subdevice.cpp | 8 +++++++-\n> >  1 file changed, 7 insertions(+), 1 deletion(-)\n> > \n> > diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp\n> > index 7a064d87da41..33279654db8c 100644\n> > --- a/src/libcamera/v4l2_subdevice.cpp\n> > +++ b/src/libcamera/v4l2_subdevice.cpp\n> > @@ -8,12 +8,18 @@\n> >  #include \"libcamera/internal/v4l2_subdevice.h\"\n> >  \n> >  #include <fcntl.h>\n> > -#include <regex>\n> >  #include <sstream>\n> >  #include <string.h>\n> >  #include <sys/ioctl.h>\n> >  #include <unistd.h>\n> >  \n> > +#pragma GCC diagnostic push\n> > +#if defined __SANITIZE_ADDRESS__ && defined __OPTIMIZE__\n> > +#pragma GCC diagnostic ignored \"-Wmaybe-uninitialized\"\n> > +#endif\n> > +#include <regex>\n> > +#pragma GCC diagnostic pop\n> > +\n> >  #include <linux/media-bus-format.h>\n> >  #include <linux/v4l2-subdev.h>\n> >  \n> > \n> > base-commit: 2ae7b2ff7438a4deecff2a8b5de685cc14e5cd44","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 5DAF4C3273\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 20 Jan 2025 08:30:43 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8988D6854D;\n\tMon, 20 Jan 2025 09:30:42 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 050A168503\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 20 Jan 2025 09:30:40 +0100 (CET)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8C7E5735;\n\tMon, 20 Jan 2025 09:29:39 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"KSXl/HJb\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1737361779;\n\tbh=JbPQ5AgmJ9QmEoIDvar2sOLFfpO1c+UwQi1oVn69ADY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=KSXl/HJblhavZRlqlc9Ej1DqCBe7yDoxSHBZ7uZ7YwIkzYLkIYuqH4a5olRjedI6B\n\t04uf2t6KuSMhHy6F+EAn+B9MjcV0b9XHMRuFGzbVhGQpiTRVpQfW3Q0K3eJCjlYq36\n\t067aYjYqZGVa0700OIWDFMgJ2OHzPc84md9Ao3XY=","Date":"Mon, 20 Jan 2025 10:30:32 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Stefan Klug <stefan.klug@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH] libcamera: v4l2_subdevice: Work around false positive\n\twarning","Message-ID":"<20250120083032.GA12716@pendragon.ideasonboard.com>","References":"<20250114143622.28803-1-laurent.pinchart@ideasonboard.com>\n\t<x7u5svqbaxiazys4spoofohnuhwplvjilsdebshhrbfitlweof@y57tcjbsltic>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<x7u5svqbaxiazys4spoofohnuhwplvjilsdebshhrbfitlweof@y57tcjbsltic>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]