[libcamera-devel] [PATCH 4/4] HACK: suppress clang-tidy warnings

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu Oct 22 17:06:47 CEST 2020


Hi Tomi,

Thank you for the patch.

On Thu, Oct 22, 2020 at 11:17:31AM +0300, Tomi Valkeinen wrote:
> These are quick hacks to silence clang-tidy warnings. The purpose of
> this patch is just to highlight the warnings on the mailing list, and
> also, if you want to try to fix some of the warnings, it may be nice to
> have all the rest suppressed.
> 
> Afaics, the thread->moveObject(this) warning is a false positive.
> Probably some of the others are too.
> 
> Note that I used assert() there in a few places, just after ASSERT().
> The reason being, ASSERT() just prints an error, while assert() aborts,
> so clang-tidy takes the assert() seriously.

LOG(Fatal) aborts too. Could this be fixed with annotate ASSERT() with
[[noreturn]] ? Something along the lines of (untested)

diff --git a/include/libcamera/internal/log.h b/include/libcamera/internal/log.h
index 4b10087a4718..a9fc5526a971 100644
--- a/include/libcamera/internal/log.h
+++ b/include/libcamera/internal/log.h
@@ -117,9 +117,14 @@ LogMessage _log(const char *file, unsigned int line,
 #endif /* __DOXYGEN__ */

 #ifndef NDEBUG
+static inline [[noreturn]] void _assert(const char *message)
+{
+	LOG(Fatal) << message;
+}
+
 #define ASSERT(condition) static_cast<void>(({				\
 	if (!(condition))						\
-		LOG(Fatal) << "assertion \"" #condition "\" failed";	\
+		_assert("assertion \"" #condition "\" failed");		\
 }))
 #else
 #define ASSERT(condition) static_cast<void>(false && (condition))

> Not for merging.
> 
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen at iki.fi>
> ---
>  src/ipa/raspberrypi/controller/histogram.cpp       | 2 +-
>  src/libcamera/object.cpp                           | 3 ++-
>  src/libcamera/pipeline/ipu3/ipu3.cpp               | 1 +
>  src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 2 ++
>  src/libcamera/pipeline/rkisp1/rkisp1.cpp           | 2 ++
>  src/libcamera/v4l2_device.cpp                      | 1 -
>  src/libcamera/v4l2_pixelformat.cpp                 | 2 +-
>  7 files changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/src/ipa/raspberrypi/controller/histogram.cpp b/src/ipa/raspberrypi/controller/histogram.cpp
> index 9916b3ed..ac3f5c48 100644
> --- a/src/ipa/raspberrypi/controller/histogram.cpp
> +++ b/src/ipa/raspberrypi/controller/histogram.cpp
> @@ -51,7 +51,7 @@ double Histogram::InterQuantileMean(double q_lo, double q_hi) const
>  	double p_lo = Quantile(q_lo);
>  	double p_hi = Quantile(q_hi, (int)p_lo);
>  	double sum_bin_freq = 0, cumul_freq = 0;
> -	for (double p_next = floor(p_lo) + 1.0; p_next <= ceil(p_hi);
> +	for (double p_next = floor(p_lo) + 1.0; p_next <= ceil(p_hi); // NOLINT: Variable 'p_next' with floating point type 'double' should not be used as a loop counter [clang-analyzer-security.FloatLoopCounter]
>  	     p_lo = p_next, p_next += 1.0) {
>  		int bin = floor(p_lo);
>  		double freq = (cumulative_[bin + 1] - cumulative_[bin]) *
> diff --git a/src/libcamera/object.cpp b/src/libcamera/object.cpp
> index cd83c684..1b1775e6 100644
> --- a/src/libcamera/object.cpp
> +++ b/src/libcamera/object.cpp
> @@ -257,7 +257,8 @@ void Object::moveToThread(Thread *thread)
>  
>  	notifyThreadMove();
>  
> -	thread->moveObject(this);
> +	// clang-tidy thinks that the thread can be deleted via DeferredDelete handling in notifyThreadMove()

The thread, or 'this' object ? It seems to be a false positive in any
case.

> +	thread->moveObject(this); // NOLINT: warning: Use of memory after it is freed [clang-analyzer-cplusplus.NewDelete]
>  }
>  
>  void Object::notifyThreadMove()
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index af47739d..eac27153 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -508,6 +508,7 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
>  	 * be at least one active stream in the configuration request).
>  	 */
>  	if (!vfCfg) {
> +		assert(mainCfg);
>  		ret = imgu->configureViewfinder(*mainCfg, &outputFormat);
>  		if (ret)
>  			return ret;
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index aa8d9340..4544d606 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -1290,6 +1290,7 @@ void RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer)
>  
>  	/* The buffer must belong to one of our streams. */
>  	ASSERT(stream);
> +	assert(stream);
>  
>  	LOG(RPI, Debug) << "Stream " << stream->name() << " buffer dequeue"
>  			<< ", buffer id " << index
> @@ -1358,6 +1359,7 @@ void RPiCameraData::ispOutputDequeue(FrameBuffer *buffer)
>  
>  	/* The buffer must belong to one of our ISP output streams. */
>  	ASSERT(stream);
> +	assert(stream);
>  
>  	LOG(RPI, Debug) << "Stream " << stream->name() << " buffer complete"
>  			<< ", buffer id " << index
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index c74a2e9b..be55c32f 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -379,6 +379,8 @@ protected:
>  		if (!info)
>  			LOG(RkISP1, Fatal) << "Frame not known";

This could be replace by ASSERT().

>  
> +		assert(info);
> +
>  		/*
>  		 * \todo: If parameters are not filled a better method to handle
>  		 * the situation than queuing a buffer with unknown content
> diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
> index 31d4dad0..f747ba79 100644
> --- a/src/libcamera/v4l2_device.cpp
> +++ b/src/libcamera/v4l2_device.cpp
> @@ -243,7 +243,6 @@ ControlList V4L2Device::getControls(const std::vector<uint32_t> &ids)
>  		LOG(V4L2, Error) << "Unable to read control " << errorIdx
>  				 << ": " << strerror(-ret);
>  		count = errorIdx - 1;
> -		ret = errorIdx;

This could indeed be dropped.

>  	}
>  
>  	updateControls(&ctrls, v4l2Ctrls, count);
> diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp
> index 03ab085c..354136b7 100644
> --- a/src/libcamera/v4l2_pixelformat.cpp
> +++ b/src/libcamera/v4l2_pixelformat.cpp
> @@ -163,7 +163,7 @@ std::string V4L2PixelFormat::toString() const
>  	}
>  
>  	if (fourcc_ & (1 << 31))
> -		strcat(ss, "-BE");
> +		memcpy(ss + 4, "-BE", 3);

What bug does this fix ?

>  
>  	return ss;
>  }

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list