[FFmpeg-devel] libavutil/thread.h: Fixed g++ build error when ASSERT_LEVEL is greater than 1

Marton Balint cus at passwd.hu
Thu Apr 20 00:27:09 EEST 2017



On Mon, 17 Apr 2017, James Almer wrote:

> On 4/17/2017 5:39 AM, Clément Bœsch wrote:
>> On Sun, Apr 16, 2017 at 05:20:02PM -0700, Aaron Levinson wrote:
>>> From 9e6a9e2b8d58f17c661a3f455e03c95587ec7b18 Mon Sep 17 00:00:00 2001
>>> From: Aaron Levinson <alevinsn at aracnet.com>
>>> Date: Sun, 16 Apr 2017 17:13:31 -0700
>>> Subject: [PATCH] libavutil/thread.h:  Fixed g++ build error when
>>>  ASSERT_LEVEL is greater than 1
>>>
>>> Purpose: libavutil/thread.h: Fixed g++ build error when ASSERT_LEVEL
>>> is greater than 1.  This is only relevant when thread.h is included by
>>> C++ files.  In this case, the relevant code is only defined if
>>> HAVE_PTHREADS is defined as 1.  Use configure --assert-level=2 to do
>>> so.
>>>
>>> Note: Issue discovered as a result of Coverity build failure.  Cause
>>> of build failure pinpointed by Hendrik Leppkes.
>>>
>>> Comments:
>>>
>>> -- libavutil/thread.h: Altered ASSERT_PTHREAD_NORET definition such
>>>    that it uses av_make_error_string instead of av_err2str().
>>>    av_err2str() uses a "parenthesized type followed by an initializer
>>>    list", which is apparently not valid C++.  This issue started
>>>    occurring because thread.h is now included by the DeckLink C++
>>>    files.  The alteration does the equivalent of what av_err2str()
>>>    does, but instead declares the character buffer as a local
>>>    variable.
>>> ---
>>>  libavutil/thread.h | 5 ++++-
>>>  1 file changed, 4 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/libavutil/thread.h b/libavutil/thread.h
>>> index 6e57447..f108e20 100644
>>> --- a/libavutil/thread.h
>>> +++ b/libavutil/thread.h
>>> @@ -36,8 +36,11 @@
>>>  #define ASSERT_PTHREAD_NORET(func, ...) do {                            \
>>>      int ret = func(__VA_ARGS__);                                        \
>>>      if (ret) {                                                          \
>>> +        char errbuf[AV_ERROR_MAX_STRING_SIZE] = "";                     \
>>>          av_log(NULL, AV_LOG_FATAL, AV_STRINGIFY(func)                   \
>>> -               " failed with error: %s\n", av_err2str(AVERROR(ret)));   \
>>> +               " failed with error: %s\n",                              \
>>> +               av_make_error_string(errbuf, AV_ERROR_MAX_STRING_SIZE,   \
>>> +                                    AVERROR(ret)));                     \
>>>          abort();                                                        \
>>>      }                                                                   \
>>>  } while (0)
>> 
>> I don't like limiting ourselves in the common C code of the project
>> because C++ is a bad and limited language. Can't you solve this by bumping
>> the minimal requirement of C++ version?
>
> We're already using C++11 when available because of atomics on mediacodec.
> Also, just tried and it seems to fail even with C++14, so it just doesn't
> work with C++.
>
> We could instead just make these strict assert wrappers work only on C
> code by for example checking for defined(__cplusplus).

I'd say let's apply the patch as is, that is the simplest solution.

Regards,
Marton


More information about the ffmpeg-devel mailing list