Bug Summary

File:root/firefox-clang/gfx/cairo/cairo/src/cairo-surface-snapshot.c
Warning:line 215, column 5
Value stored to 'status' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name Unified_c_gfx_cairo_cairo_src4.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/gfx/cairo/cairo/src -fcoverage-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/gfx/cairo/cairo/src -resource-dir /usr/lib/llvm-21/lib/clang/21 -include /root/firefox-clang/config/gcc_hidden.h -include /root/firefox-clang/obj-x86_64-pc-linux-gnu/mozilla-config.h -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/system_wrappers -U _FORTIFY_SOURCE -D _FORTIFY_SOURCE=2 -D _GLIBCXX_ASSERTIONS -D DEBUG=1 -D HAVE_FT_LOAD_SFNT_TABLE -D PACKAGE_VERSION="moz" -D PACKAGE_BUGREPORT="http://bugzilla.mozilla.org/" -D CAIRO_HAS_PTHREAD -D _GNU_SOURCE -D MOZ_TREE_PIXMAN -D SIZEOF_VOID_P=__SIZEOF_POINTER__ -D SIZEOF_INT=__SIZEOF_INT__ -D SIZEOF_LONG=__SIZEOF_LONG__ -D SIZEOF_LONG_LONG=__SIZEOF_LONG_LONG__ -D HAVE_UINT64_T -D HAVE_CXX11_ATOMIC_PRIMITIVES -D MOZ_HAS_MOZGLUE -D MOZILLA_INTERNAL_API -D IMPL_LIBXUL -D MOZ_SUPPORT_LEAKCHECKING -D STATIC_EXPORTABLE_JS_API -I /root/firefox-clang/gfx/cairo/cairo/src -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/gfx/cairo/cairo/src -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nspr -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nss -D MOZILLA_CLIENT -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/freetype2 -I /usr/include/libpng16 -internal-isystem /usr/lib/llvm-21/lib/clang/21/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-error=tautological-type-limit-compare -Wno-range-loop-analysis -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=free-nonheap-object -Wno-error=atomic-alignment -Wno-error=deprecated-builtins -Wno-psabi -Wno-error=builtin-macro-redefined -Wno-unknown-warning-option -Wno-enum-compare -Wno-int-to-pointer-cast -Wno-int-conversion -Wno-incompatible-pointer-types -Wno-sign-compare -Wno-type-limits -Wno-missing-field-initializers -Wno-conversion -Wno-narrowing -Wno-switch -Wno-unused -Wno-unused-variable -Wno-error=uninitialized -Wno-absolute-value -Wno-deprecated-register -Wno-incompatible-pointer-types -Wno-macro-redefined -Wno-shift-negative-value -Wno-tautological-compare -Wno-tautological-constant-out-of-range-compare -Wno-unreachable-code -ferror-limit 19 -fstrict-flex-arrays=1 -stack-protector 2 -fstack-clash-protection -ftrivial-auto-var-init=pattern -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2025-06-26-231904-1820671-1 -x c Unified_c_gfx_cairo_cairo_src4.c
1/* cairo - a vector graphics library with display and print output
2 *
3 * Copyright © 2002 University of Southern California
4 * Copyright © 2005 Red Hat, Inc.
5 * Copyright © 2009 Intel Corporation
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it either under the terms of the GNU Lesser General Public
9 * License version 2.1 as published by the Free Software Foundation
10 * (the "LGPL") or, at your option, under the terms of the Mozilla
11 * Public License Version 1.1 (the "MPL"). If you do not alter this
12 * notice, a recipient may use your version of this file under either
13 * the MPL or the LGPL.
14 *
15 * You should have received a copy of the LGPL along with this library
16 * in the file COPYING-LGPL-2.1; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
18 * You should have received a copy of the MPL along with this library
19 * in the file COPYING-MPL-1.1
20 *
21 * The contents of this file are subject to the Mozilla Public License
22 * Version 1.1 (the "License"); you may not use this file except in
23 * compliance with the License. You may obtain a copy of the License at
24 * http://www.mozilla.org/MPL/
25 *
26 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
27 * OF ANY KIND, either express or implied. See the LGPL or the MPL for
28 * the specific language governing rights and limitations.
29 *
30 * The Original Code is the cairo graphics library.
31 *
32 * The Initial Developer of the Original Code is University of Southern
33 * California.
34 *
35 * Contributor(s):
36 * Carl D. Worth <cworth@cworth.org>
37 * Chris Wilson <chris@chris-wilson.co.uk>
38 */
39
40#include "cairoint.h"
41
42#include "cairo-error-private.h"
43#include "cairo-image-surface-private.h"
44#include "cairo-surface-snapshot-inline.h"
45
46static cairo_status_t
47_cairo_surface_snapshot_finish (void *abstract_surface)
48{
49 cairo_surface_snapshot_t *surface = abstract_surface;
50 cairo_status_t status = CAIRO_STATUS_SUCCESS;
51
52 TRACE ((stderr, "%s\n", __FUNCTION__));
53
54 if (surface->clone != NULL((void*)0)) {
55 cairo_surface_finish_moz_cairo_surface_finish (surface->clone);
56 status = surface->clone->status;
57
58 cairo_surface_destroy_moz_cairo_surface_destroy (surface->clone);
59 }
60
61 CAIRO_MUTEX_FINI (surface->mutex)pthread_mutex_destroy (&(surface->mutex));
62
63 return status;
64}
65
66static cairo_status_t
67_cairo_surface_snapshot_flush (void *abstract_surface, unsigned flags)
68{
69 cairo_surface_snapshot_t *surface = abstract_surface;
70 cairo_surface_t *target;
71 cairo_status_t status;
72
73 target = _cairo_surface_snapshot_get_target (&surface->base);
74 status = target->status;
75 if (status == CAIRO_STATUS_SUCCESS)
76 status = _cairo_surface_flush (target, flags);
77 cairo_surface_destroy_moz_cairo_surface_destroy (target);
78
79 return status;
80}
81
82static cairo_surface_t *
83_cairo_surface_snapshot_source (void *abstract_surface,
84 cairo_rectangle_int_t *extents)
85{
86 cairo_surface_snapshot_t *surface = abstract_surface;
87 return _cairo_surface_get_source (surface->target, extents); /* XXX racy */
88}
89
90struct snapshot_extra {
91 cairo_surface_t *target;
92 void *extra;
93};
94
95static cairo_status_t
96_cairo_surface_snapshot_acquire_source_image (void *abstract_surface,
97 cairo_image_surface_t **image_out,
98 void **extra_out)
99{
100 cairo_surface_snapshot_t *surface = abstract_surface;
101 struct snapshot_extra *extra;
102 cairo_status_t status;
103
104 extra = _cairo_malloc (sizeof (*extra))((sizeof (*extra)) != 0 ? malloc(sizeof (*extra)) : ((void*)0
))
;
105 if (unlikely (extra == NULL)(__builtin_expect (!!(extra == ((void*)0)), 0))) {
106 *extra_out = NULL((void*)0);
107 return _cairo_error (CAIRO_STATUS_NO_MEMORY);
108 }
109
110 extra->target = _cairo_surface_snapshot_get_target (&surface->base);
111 status = _cairo_surface_acquire_source_image (extra->target, image_out, &extra->extra);
112 if (unlikely (status)(__builtin_expect (!!(status), 0))) {
113 cairo_surface_destroy_moz_cairo_surface_destroy (extra->target);
114 free (extra);
115 extra = NULL((void*)0);
116 }
117
118 *extra_out = extra;
119 return status;
120}
121
122static void
123_cairo_surface_snapshot_release_source_image (void *abstract_surface,
124 cairo_image_surface_t *image,
125 void *_extra)
126{
127 struct snapshot_extra *extra = _extra;
128
129 _cairo_surface_release_source_image (extra->target, image, extra->extra);
130 cairo_surface_destroy_moz_cairo_surface_destroy (extra->target);
131 free (extra);
132}
133
134static cairo_bool_t
135_cairo_surface_snapshot_get_extents (void *abstract_surface,
136 cairo_rectangle_int_t *extents)
137{
138 cairo_surface_snapshot_t *surface = abstract_surface;
139 cairo_surface_t *target;
140 cairo_bool_t bounded;
141
142 target = _cairo_surface_snapshot_get_target (&surface->base);
143 bounded = _cairo_surface_get_extents (target, extents);
144 cairo_surface_destroy_moz_cairo_surface_destroy (target);
145
146 return bounded;
147}
148
149static const cairo_surface_backend_t _cairo_surface_snapshot_backend = {
150 CAIRO_INTERNAL_SURFACE_TYPE_SNAPSHOT,
151 _cairo_surface_snapshot_finish,
152 NULL((void*)0),
153
154 NULL((void*)0), /* create similar */
155 NULL((void*)0), /* create similar image */
156 NULL((void*)0), /* map to image */
157 NULL((void*)0), /* unmap image */
158
159 _cairo_surface_snapshot_source,
160 _cairo_surface_snapshot_acquire_source_image,
161 _cairo_surface_snapshot_release_source_image,
162 NULL((void*)0), /* snapshot */
163
164 NULL((void*)0), /* copy_page */
165 NULL((void*)0), /* show_page */
166
167 _cairo_surface_snapshot_get_extents,
168 NULL((void*)0), /* get-font-options */
169
170 _cairo_surface_snapshot_flush,
171};
172
173static void
174_cairo_surface_snapshot_copy_on_write (cairo_surface_t *surface)
175{
176 cairo_surface_snapshot_t *snapshot = (cairo_surface_snapshot_t *) surface;
177 cairo_image_surface_t *image;
178 cairo_surface_t *clone;
179 void *extra;
180 cairo_status_t status;
181
182 TRACE ((stderr, "%s: target=%d\n",
183 __FUNCTION__, snapshot->target->unique_id));
184
185 /* We need to make an image copy of the original surface since the
186 * snapshot may exceed the lifetime of the original device, i.e.
187 * when we later need to use the snapshot the data may have already
188 * been lost.
189 */
190
191 CAIRO_MUTEX_LOCK (snapshot->mutex)pthread_mutex_lock (&(snapshot->mutex));
192
193 if (snapshot->target->backend->snapshot != NULL((void*)0)) {
194 clone = snapshot->target->backend->snapshot (snapshot->target);
195 if (clone != NULL((void*)0)) {
196 assert (clone->status || ! _cairo_surface_is_snapshot (clone))((void) sizeof ((clone->status || ! _cairo_surface_is_snapshot
(clone)) ? 1 : 0), __extension__ ({ if (clone->status || !
_cairo_surface_is_snapshot (clone)) ; else __assert_fail ("clone->status || ! _cairo_surface_is_snapshot (clone)"
, "/root/firefox-clang/gfx/cairo/cairo/src/cairo-surface-snapshot.c"
, 196, __extension__ __PRETTY_FUNCTION__); }))
;
197 goto done;
198 }
199 }
200
201 /* XXX copy to a similar surface, leave acquisition till later?
202 * We should probably leave such decisions to the backend in case we
203 * rely upon devices/connections like Xlib.
204 */
205 status = _cairo_surface_acquire_source_image (snapshot->target, &image, &extra);
206 if (unlikely (status)(__builtin_expect (!!(status), 0))) {
207 snapshot->target = _cairo_surface_create_in_error (status);
208 status = _cairo_surface_set_error (surface, status);
209 goto unlock;
210 }
211 clone = image->base.backend->snapshot (&image->base);
212 _cairo_surface_release_source_image (snapshot->target, image, extra);
213
214done:
215 status = _cairo_surface_set_error (surface, clone->status);
Value stored to 'status' is never read
216 snapshot->target = snapshot->clone = clone;
217 snapshot->base.type = clone->type;
218unlock:
219 CAIRO_MUTEX_UNLOCK (snapshot->mutex)pthread_mutex_unlock (&(snapshot->mutex));
220}
221
222/**
223 * _cairo_surface_snapshot:
224 * @surface: a #cairo_surface_t
225 *
226 * Make an immutable reference to @surface. It is an error to call a
227 * surface-modifying function on the result of this function. The
228 * resulting 'snapshot' is a lazily copied-on-write surface i.e. it
229 * remains a reference to the original surface until that surface is
230 * written to again, at which time a copy is made of the original surface
231 * and the snapshot then points to that instead. Multiple snapshots of the
232 * same unmodified surface point to the same copy.
233 *
234 * The caller owns the return value and should call
235 * cairo_surface_destroy() when finished with it. This function will not
236 * return %NULL, but will return a nil surface instead.
237 *
238 * Return value: The snapshot surface. Note that the return surface
239 * may not necessarily be of the same type as @surface.
240 **/
241cairo_surface_t *
242_cairo_surface_snapshot (cairo_surface_t *surface)
243{
244 cairo_surface_snapshot_t *snapshot;
245 cairo_status_t status;
246
247 TRACE ((stderr, "%s: target=%d\n", __FUNCTION__, surface->unique_id));
248
249 if (unlikely (surface->status)(__builtin_expect (!!(surface->status), 0)))
250 return _cairo_surface_create_in_error (surface->status);
251
252 if (unlikely (surface->finished)(__builtin_expect (!!(surface->finished), 0)))
253 return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED));
254
255 if (surface->snapshot_of != NULL((void*)0))
256 return cairo_surface_reference_moz_cairo_surface_reference (surface);
257
258 if (_cairo_surface_is_snapshot (surface))
259 return cairo_surface_reference_moz_cairo_surface_reference (surface);
260
261 snapshot = (cairo_surface_snapshot_t *)
262 _cairo_surface_has_snapshot (surface, &_cairo_surface_snapshot_backend);
263 if (snapshot != NULL((void*)0))
264 return cairo_surface_reference_moz_cairo_surface_reference (&snapshot->base);
265
266 snapshot = _cairo_malloc (sizeof (cairo_surface_snapshot_t))((sizeof (cairo_surface_snapshot_t)) != 0 ? malloc(sizeof (cairo_surface_snapshot_t
)) : ((void*)0))
;
267 if (unlikely (snapshot == NULL)(__builtin_expect (!!(snapshot == ((void*)0)), 0)))
268 return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED));
269
270 _cairo_surface_init (&snapshot->base,
271 &_cairo_surface_snapshot_backend,
272 NULL((void*)0), /* device */
273 surface->content,
274 surface->is_vector);
275 snapshot->base.type = surface->type;
276
277 CAIRO_MUTEX_INIT (snapshot->mutex)do { cairo_mutex_t _tmp_mutex = { { 0, 0, 0, 0, PTHREAD_MUTEX_TIMED_NP
, 0, 0, { 0, 0 } } }; memcpy (&(snapshot->mutex), &
_tmp_mutex, sizeof (_tmp_mutex)); } while (0)
;
278 snapshot->target = surface;
279 snapshot->clone = NULL((void*)0);
280
281 status = _cairo_surface_copy_mime_data (&snapshot->base, surface);
282 if (unlikely (status)(__builtin_expect (!!(status), 0))) {
283 cairo_surface_destroy_moz_cairo_surface_destroy (&snapshot->base);
284 return _cairo_surface_create_in_error (status);
285 }
286
287 snapshot->base.device_transform = surface->device_transform;
288 snapshot->base.device_transform_inverse = surface->device_transform_inverse;
289
290 _cairo_surface_attach_snapshot (surface,
291 &snapshot->base,
292 _cairo_surface_snapshot_copy_on_write);
293
294 return &snapshot->base;
295}